25 Ağustos 2020 Salı

PREFER TRY-WITH-RESOURCES TO TRY-FINALLY

Merhaba,

Bu yazimda try-with-resources nedir ve neden kullanmaliyiz, onu anlatmaya calisacagim.

Javada  kullanilan bircok resource manuel olarak close() cagrimi ile kapatilmasi gerekiyor. Burada genelde izlenen yol baglantiyi acip try icinde istedigimiz islemi yapip finally de bu connection i close etmektir.

static String firstLineOfFile(String path) throws IOException { 
BufferedReader br = new BufferedReader(new FileReader(path)); 
    try { 
        return br.readLine(); 
    } finally { 
      br.close(); 
    } 
}
Ama bu yontem artik cok tercih edilen bir yontem degildir. Cunku bir tane daha resource eklendiginde yonetimi zorlasacaktir.


static void copy(String src, String dst) throws IOException { 
    InputStream in = new FileInputStream(src); 
    try { 
    OutputStream out = new FileOutputStream(dst); 
        try { byte[] buf = new byte[BUFFER_SIZE]; 
        int n; 
        while ((n = in.read(buf)) >= 0) 
        out.write(buf, 0, n); 
        } 
        finally { 
            out.close(); 
        } 
    } finally {
     in.close();
    } 
}

Bir de uzerine connection close ederken hata cikarsa onlari da handle etmek gerekir. Yani finally icinde sadece close yapmak yerine tekrar try catch kullanmak gerekir.

Tum bunlardan kurtulmak icin try-with-resources kullanmaliyiz.


static void copy(String src, String dst) throws IOException {
 try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst)) { 
    byte[] buf = new byte[BUFFER_SIZE]; 
    int n; 
    while ((n = in.read(buf)) >= 0)
       out.write(buf, 0, n); 
   } 
}







Yararlandigim kaynak:

Effective Java 3rd Edition

Avoid Creating Unnecessary Objects

Merhaba,

Bu yazimda Effective Java kitabindaki Avoid Creating Unnecessary Objects maddesindeki bir ornekten bahsedecegim. Java da Autoboxing - Unboxing kavramlari


Yapacagimiz islem tum integerlari toplayan bir kod yazmak. Sum'i long olarak tanimladik cunku int deger toplamin sonucunu tutmak icin kucuk kaliyor.

private static long sum() { 
Long sum = 0L;
 for (long i = 0; i <= Integer.MAX_VALUE; i++) 
    sum += i;
return sum;
}

Bu kodu calistirdigimizda sorunsuz calisiyor. Benim bilgisayarimda 8 saniyede calisti.


Bir de sum degerini Long degil de long olarak calistirmayi denedim. Bu durumda ise 1 saniye surdu.

Buradan cikarilacak ders sudur:


Prefer primitives to boxed primitives, and watch out for unintentional autoboxing


Yani diyorki boxed primitive yerine primivite tercih edin.

Boxed olanlar wrapper classlaridir. Onlari kullanmak her zaman gerekli olmayabilir.


Autoboxing Ornegi:


int olan primitive bir degeri Integer Wrapper class olan ArrayList te tutmak

private static List<Integer> sum() { 
List<Integer> list = new ArrayList<>();
 for (int i = 0; i <= 10; i++) 
    list.add(i);
return list;
}