Hibernate ve Spring Data JPA arasındaki farklar

Merhaba arkadaşlar, bu yazımda Hibernate ve Spring Data JPA arasındaki temel farklılıklara değineceğim.

Konuya geçmeden önce  Hibernate, JPA ve Spring Data JPA kavramlarından bahsetmenin faydalı olacağını düşünüyorum.

JPA (Java Persistence API) nedir?

Java Persistence API herhangi bir java nesnesinin veri tabanındaki ilişkisel bir tabloya eklenebilmesini, o tablodan okunabilmesi gibi çeşitli özellikler sağlar.

Hibernate nedir?

Hibernate, Java ortamları için bir ORM (Object Relational Mapping) çözümüdür. ORM; model sınıflarımızın ilişkisel veri tabanındaki tablolarımızla eşleşebilmesini sağlayan bir programlama tekniğidir. Bir nevi uygulama ile ilişkisel bir veri tabanı arasında bir köprü olarak düşünülebilir. Hibernate, Java tabanlı bir ORM teknolojisidir.

Buraya kadar yazılanlardan yola çıkarak JPA (Java Persistence Api) ‘ın bir standart, Hibernate’in ise bir JPA uygulaması olduğunu aklımızdan çıkarmayalım.

Spring Data JPA nedir?

Spring Data; Spring kütüphanesinin bir parçasıdır.

Spring Data sanıldığı aksine Hibernate gibi bir JPA uygulaması değildir. Sadece JPA uygulamamızın en üst katmanına ekstra soyut bir katman ekleyen bir kütüphanedir.

Spring Data JPA GenericDao özel uygulamalarına bir çözüm sunar. Metot adı kuralları aracılığıyla sizin adınıza JPA sorguları oluşturabilir.

 

Buraya kadar olan kısmı toparlamak gerekirse Hibernate ile Spring Data JPA arasındaki temel farklılıklar şunlardır;

Hibernate bir JPA uygulaması iken Spring Data JPA bir veri erişimi soyutlamasıdır.

Spring Data ile Hibernate, Eclipse Link gibi herhangi bir JPA uygulamasını beraber kullanabilirsiniz. Dolayısıyla Hibernate ile Spring Data JPA bir rakip değillerdir ve aynı kapsamda değerlendirilemezler aksine birbirlerini tamamlayıcı özellikler taşırlar.

Bir dahaki yazımda görüşmek üzere, hoşçakalın…

 

 

Java Serialization nedir

Merhaba arkadaşlar. Bu yazımda Java Serialization (Serileştirme) konusuna değineceğim.

Bir klişe olacak ama Java bilindiği üzerine nesneye yönelik bir dil. Primitive tipler (int, char, boolean … gibi) hariç neredeyse herşey nesne ve bu nesneleri sürekli ve sürekli kullanırız. Ancak nesneleri bazen JVM dışında kullanmak gerekebiliyor. Fakat dışarıda kullandığımız bir nesnemizi tekrar içeride kullanmak istediğimizde nesne içinde kullanılan değerlerin hangi tipte olduğunu öğrenemiyoruz. Yani herhangi bir sınıftan bir nesne üretip, bunu bir dosyaya yazdırıp onu tekrar dosyadan okuğumuzda değerlerin tip bilgisini bilememe problemimiz var. İşte tam bu durumda Java Serialization API yardımımıza koşuyor.

Bu durumu basit bir örnekle anlatarak durumun daha iyi pekişeceğine inanıyorum.

Araba bilgilerini tutan Car diye bir sınıfımız olsun ve bu bilgileri bir dosyaya kaydedip, tekrar okuma işlemi yapalım.

Serileştirme işlemi için Serializable arayüzünü implement etmek gerekiyor.

Araba sınıfımız :

import java.io.Serializable;

public class Car implements Serializable {
    private String brand;
    private String model;

    Car(final String brand, final String model) {
        this.brand = brand;
        this.model = model;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(final String brand) {
        this.brand = brand;
    }

    public String getModel() {
        return model;
    }

    public void setModel(final String model) {
        this.model = model;
    }
}

 

Nesnemizi dosyaya yazdırdığımız test sınıfımız :

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Main {
    public static void main(final String[] args) {
        write();
    }
    private static void write(){
        try{
            final Car car = new Car("Seat", "Leon");
            final FileOutputStream file = new FileOutputStream("/Users/okan/Documents/car.txt");
            final ObjectOutputStream write = new ObjectOutputStream(file);
            write.writeObject(car);
            write.close();
        }
        catch(final Exception e){
            System.out.println(e.getMessage());
        }
    }
}

 

Nesnemizi dosyaya yazdığımız zaman dosyamızın çıktısı şu şekilde.

¨ÌsrCarÇ«5xÕçLbrandtLjava/lang/String;Lmodelq~xptSeattLeon

 

Şimdi gelin bu nesneyi dosyadan tekrar okuyalım.

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class Main {
    public static void main(final String[] args) {
        read();
    }

    private static void read() {
        try {
            final FileInputStream file = new FileInputStream("/Users/okan/Documents/car.txt");
            final ObjectInputStream read = new ObjectInputStream(file);
            final Car car = (Car) read.readObject();
            System.out.println(car.toString());
            read.close();
        }
        catch (final Exception e) {
            System.out.println(e.getMessage());
        }
    }

}

 

Çıktımız :

Marka : Seat
Model : Leon

 

Görüldüğü gibi dosyaya yazdırdığımız nesneyi tekrar okuyup, başarılı bir şekilde konsolumuza yazdırabildik.

Bir dahaki yazımda görüşmek üzere, hoşçakalın.

Java Optional Sınıfı

Merhaba arkadaşlar. Bu yazımda Java 8 ile birlikte hayatımıza giren en önemli özelliklerden biri olan Optional sınıfını anlatmak istiyorum.

Bu sınıf; null referanslar yerine isteğe bağlı değerleri göstermek için iyi bir çözüm sunmaktadır.

Optional sınıfı java.util paketine aittir.

import java.util.Optional;

Şimdi basitçe bir optional nesnesi nasıl oluşturulur ona bakalım.

Optional empty = Optional.empty();

Yukarıda gördüğünüz üzere basitçe Optional sınıfının empty() metodunu kullanarak boş bir Optional nesnesi oluşturmuş olduk.

Bir Optional nesnesi üzerinde herhangi bir değer olup, olmadığını nasıl kontrol ediyoruz ona bakalım.

empty.isPresent()

Yukarıdaki blokta olduğu gibi isPresent() metodunu kullanarak herhangi bir Optional nesnesi üzerinde bir değer olup, olmadığını kontrol edebiliriz. Sonuç olarak üzerinde henüz herhangi bir değer olmadığı için bize false dönecektir.

Ayrıca Optional tipinde olmayan bir nesneyi Optional tipine çevirebilmemiz mümkün.

String name = "The Coders";
Optional<String> var = Optional.of(name);

Fakat bazı durumlarda null olan nesnelere de bu işlemi uygulayabilmemiz gerekiyor. Bunun için Optional.ofNullable() metodunu kullanabiliriz. Aksi halde NullPointerException hatasıyla karşılaşabiliriz.

String name = null;
Optional<String> var = Optional.ofNullable(name);

Optional sınıfının en önemli özelliklerinden biri de ifPresent metodudur. Bu metod; Optional nesnesinin üzerinde herhangi bir değer tutulduğu zaman istenilen işlemlerin yapılmasına olanak sağlar.

String name = "The Coders";
Optional<String> var = Optional.ofNullable(name);
var.ifPresent(v -> System.out::println);

Bazen Optional nesnesi üzerinde herhangi bir değerin tutulup, tutulmadığının kontrolü yapılırken tutulmadığı durumdaki senaryoları tasarlayabilmemiz gerekiyor. Bunun için Optional sınıfının bize sunduğu çözümlere bakalım. Bunlar; orElse(), orElseGet(), orElseThrow()

orElse() kullanımı

Eğer Optional nesnesi üzerinde herhangi bir değer tanımlı değilse bu durumda istediğimiz değeri dönebiliriz.

String name = null;
Optional<String> optionalName = Optional.ofNullable(name);
String result = optionalName.orElse("The Coders");

orElseGet() kullanımı

orElseGet(); orElse() metoduna benzerdir. Eğer Optional nesnesi üzerinde herhangi bir değer tanımlı değilse bu durumda istediğimiz değeri orElse() deki gibi direk dönmek yerine functional interface kullanabiliriz.

String name = null;
Optional<String> optionalName = Optional.ofNullable(name);
String result = optionalName.orElseGet(() -> "The Coders");

orElseThrow() kullanımı

Eğer Optional nesnesi üzerinde herhangi bir değer tanımlı değilse bu durumda hata fırlatabiliriz.

String name = null; 
Optional<String> optionalName = Optional.ofNullable(name); 
String result = optionalName.orElseThrow(IllegalArgumentException::new);

Optional nesnesi içindeki değeri almak için kullanılan diğer bir yöntem ise get() metodudur.

Optional<String> optionalName = Optional.ofNullable("The Coders");
String name = optionalName.get();

Fakat bu yöntemin bir dezavantajı vardır. Eğer Optional nesnesi üzerinde herhangi bir değer yoksa ve direkt olarak get() metodunu kullanırsak NoSuchElementException() hatasını alırız.

Bir dahaki yazımda görüşmek üzere, hoşçakalın.

Java instanceof kullanımı

Merhaba arkadaşlar. Bu yazımda Java projelerimizde sık bir şekilde kullandığımız instanceof operatöründen bahsedeceğim.

Java instanceof operatörü herhangi bir nesnenin belirtilen türe ait olup, olmadığını öğrenmek için kullanılır. Bu operatör aynı zamanda tip karşılaştırmak için de kullanıdır ve Boolean tipinde true yada false değerini döner. Bu operatör null bir değişkene uygulandığında false değerini dönmekle yükümlüdür.

Şimdi basit bir örnek yapalım.

public class MainClass {
    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car instanceof Car);
    }
}
Output : true

Yukarıda kod bloğunda gördüğünüz üzere Car sınıfından bir nesne yarattık ve bu nesnenin Car sınıfına ait olup, olmadığını ekrana yazdırdık ve sonuç olarak bize true değerini döndürdü.

Alt sınıf nesnesinin türü de aynı zamanda bağlı olduğu üst sınıfının türüyle aynıdır. Yani Car sınıfımızın bir alt sınıfı olarak Opel sınıfı olsun. Opel sınıfından bir nesne yaratıp, bu nesnenin Car sınıfına ait olup olmadığını sorgularsak sonuç olarak bize true dönecektir.

Şimdi bunla ilgili bir örnek yapalım.

public class Opel extends Car {
}
public class MainClass {
    public static void main(String[] args) {
        Opel opel = new Opel();
        System.out.println(opel instanceof Car);
    }
}
Output : true

Yazının başında da bahsettiğim gibi instanceof operatörünü null bir değişkene uygularsak sonuç olarak bize false döner.

public class MainClass {
    public static void main(String[] args) {
        Opel opel = null;
        System.out.println(opel instanceof Opel);
    }
}
Output : false

Bir dahaki yazıda görüşmek üzere, hoşçakalın 🙂 ..

Java – Throw ve Throws Kavramları

Merhaba arkadaşlar. Bu yazımda Java’da kullanılan throw ve throws kavramlarını ele alacağım.

Throw Kavramı

Yazdığımız Java programında açıkca throw ifadesini kullanarak bir istisna fırlatmak mümkündür. throw ifadesinin genel formu aşağıdaki gibidir.

throw FırlatılabilirNesne;

Burada FirlatilabilirNesne, Throwable veya onun herhangi bir alt sınıfı tipinde bir nesne olmak zorundadır. Throwable olmayan String, Object, Int, Char.. gibi tipler istisna olarak kullanılamaz. Throwable bir nesne elde etmenin iki yolu vardır. Birinci yolu catch cümleciği içinde parametre olarak kullanılabilir ya da new operatörü ile yeni bir nesne oluşturabilirsiniz.

Programın işleyişi throw ifadesinden hemen sonra durur ve sonra hiçbir ifade çalıştırılamaz. Kapsayan en yakın try bloğunda istisna tipiyle eşleşen bir catch cümleciği aranır. Bulunmaz ise sıradaki kapsayan try bloğu denetlenir. Denetleme try bloklarının sonuna kadar devam eder. Eğer istisna tipiyle eşleşen bir catch bulunamazsa program durur.

Şimdi bir istisna oluşturan ve bunu fırlatan basit bir örneği inceleyelim.

Ekran Alıntısı

Bu program aynı hatayı yakalamak için iki şansa sahiptir. Birincisi main() metodunun içinde çağırılan olustur_firlat metodunun try bloğunda hata oluşturulur ve catch bloğunda yakalanır. İkincisi main() metodunun içindeki catch bloğudur. Örnek kodumuzda kullanılan new kelimesini hata nesnesi oluşturmak için kullanırız.

Throws Kavramı

Eğer bir metot yakalayamadığı bir istisnaya neden olursa, metodu çağıranların kendilerini istisnaya karşı koruyabilmeleri için çağıran metodun bu davranışı belirtmesi gerekir. Bunu metodun bildirimine bir throws ifadesi ekleyerek yapabilirsiniz. throws ifadesi bir metodun fırlatabileceği istisna tiplerini belirtir. Eğer belirtilmez ise derleme zamanı hatası alınır.

throws ifadesinin genel formu aşağıdaki gibidir.

tip metot_adi (parametreler) throws istisna_listesi {

//metot gövdesi

}

Burada istisna_listesi metodun fırlatabileceği istisna tiplerinin virgülle ayrılmış halidir.

Aşağıdaki örnek kodumuza bakalım.

Ekran Alıntısı

Kodda gördüğünüz IllegalAccessException ifadesi metodumuzun fırlatabileceği hatanın tipidir. Bunu yazmazsak derleme hatası alırız. throwOne() metodunun içinde yeni bir hata nesnesi yaratılıp, fırlatılmıştır. Fırlatılan bu hata main() metodumuzun catch bloğunda yakalanmaktadır. Bu şekilde hata potansiyeline sahip metotlarımızın hata bildirimini yaparak bu metotları çağıran programların herhangi bir çalışma hatasıyla karşılaşmadan işleyişine devam etmesini sağlayabiliriz.

Bir daha ki yazımda görüşmek üzere..

 

Java This Anahtar Kelimesi

Merhaba arkadaşlar. Bu yazımda nesneye yönelik programlama dillerinde özellikle Java’da sıkça kullandığımız this ifadesinden bahsedeceğim.

Basitçe söylemek gerekirse this ifadesi o anda hangi nesne üzerinde işlemler yapılıyorsa o nesnenin ifadesini döndürür.

This ifadesinin bir kaç kullanımından bahsedelim.

Bu ifade genellikle değişken ismi çakışmalarını önlemek için kullanılabilir. Bu durum aslında this ifadesinin en çok kullanıldığı durumlardan birisidir. Çakışma olayını biraz açarsak; bir yapıcı metoda(constructor) gönderdiğimiz parametrelerin ismi sınıf değişkenleriyle aynı ise this kullanarak bu karışıklılığı önleyebiliriz.

Aşağıdaki örneğe bakalım.

Ekran AlıntısıEkran Alıntısı1

Yukarıdaki örnek kodda gördüğünüz üzere, ana sınıfımızda Ayşe Yılmaz diye bir öğrenci nesnesi oluşturduk ve bu nesneyi oluşturduğumuz ilk anda Ogrenci sınıfının yapıcı metodu çalışacaktır. Yapıcı metot isim ve soyisim adında iki parametre kullanmaktadır. Bir de yapıcı metodumuz dışındaki isim ve soyisim değişkenlerini görmektesiniz. Yapıcı metodun kullandığı parametrelerle bu değişkenlerin isminin aynı olduğuna aldanmayın aslında farklıdır. Yapıcı metottaki parametreler aslında bir iletim görevi görür bu parametreler ana sınıfımızdan gelen Ayşe ve Yılmaz kelimelerini yapıcı metoda iletmektedir. Ogrenci sınıfı değişkenleri olan isim ve soyisim ise bu parametrelerle gönderilen verileri tutmakla görevlidir. İşte tam burada this ifadesini kullanarak bu çakışmayı giderebiliriz. this.isim sınıf değişkeni olan isim değişkenini işaret ederken isim ifadesi yapıcı metoda gönderilen parametreyi temsil etmektedir.

this anahtar kelimesini kullanarak aynı sınıf içindeki diğer yapıcı metodları da çağırabilmemiz mümkün.

Aşağıdaki örneğe bakalım.

Ekran Alıntısı3Ekran Alıntısı5

Yukarıdaki örnek kodlarda gördüğünüz üzere bu seferde Mustafa Işık diye bir öğrenci nesnesi yarattık. Nesneyi yarattığımız anda ilk olarak iki parametre alan yapıcı metodumuz çalışacaktır. Bu yapıcı metodun içinden de this (isim, soyisim, 181) ifadesi ile diğer yapıcı metodumuz çalışacaktır. Böylece öğrencimizin isim ve soy ismine ek olarak numarasını da yapılandırabiliriz. Kısacası this ifadesinin bu kullanımı bir yapıcı metodun içinden başka bir yapıcı metoda göndermede bulunmaktır.

this anahtar kelimesinin diğer bir kullanımı da tek başına nesnelerin referansını temsil edebilmesidir.

Aşağıdaki örneğe bakalım

Ekran Alıntısı Ekran Alıntısı1

Yukarıda örnek kodlarda gördüğünüz üzere iki tane öğrenci nesnesi ve ogr_liste adında öğrencilerin tutulacağı bir ArrayList oluşturulmuştur. Ogrenci sınıfımızda da bu nesnelerimizi listemize eklemeye yarayan ekle metodu bulunmaktadır. Bu metodumuza gönderdiğimiz parametre öğrencilerin tutulduğu listedir ve metodun gövdesinde bulunan this ifadesi de metodun hangi öğrenci nesnesi üzerinden çağrıldığını belirtir. Yani ana sınıfımızda o1.ekle() ifadesi ile Mustafa Işık’ı temsil eden öğrenci nesnesi ekle metodu ile öğrenci listesine eklenir. Ekle metodunun içindeki this ifadesi aslında bu nesneyi temsil etmektedir.

Şunu da hatırlatmakta fayda var this ifadelerini statik metotlarımız içinde kullanamayız çünkü statik metotlar sınıf metotlarıdır. Bu metotlar nesnelerle ilgilenmez.

Bir sonraki yazımda görüşmek dileğiyle. İyi çalışmalar..

 

 

 

JDBC – Statement ve PreparedStatement arasındaki farklar

Merhaba arkadaşlar. Bu yazımda önceden benim de çok merak ettiğim bir konu olan Statement ve PreparedStatement arasındaki farkları ve birbirlerine göre avantajlarını, dezavantajlarını anlatacağım.

Statement ve PreparedStatement ifadelerini mutlaka bir yerlerde kullanmışızdır. Özellikle herhangi bir SQL sorgusu çalıştırmak istediğimizde bu ikisinden herhangi birini kullanırız. Görünüşte hiçbir farkı olmayabilir ama arka tarafta işler farklı işliyor 🙂

Peki hangisini ne zaman hangi durumlarda kullanmak daha faydalıdır buna bakacağız.

Yazdığımız herhangi bir SQL sorgusunu Statement durumunda çalıştırdığımızı varsayalım. Bu sorgu her çalıştırıldığında veri tabanının belleğinde bu sorgunun bir örneği saklanır. Bu sorgunun binlerce kere çalıştırıldığını düşünürsek bu durum zararlı olabilir. Veri tabanı performansı düşebilir veya bağlantı kopmaları yaşanabilir. Bu durumda PreparedStatement kullanmak faydalı olabilir. Herhangi bir SQL sorgusunu PreparedStatement durumunda çalıştırdığımızı düşünelim. Böylece veri tabanında bu sorgusunun sadece bir kere örneği saklanır ve bin kere de çalıştırsak bu sorgunun veri tabanının belleğinde sadece bir örneği tutulur. Böylece PreparedStatement daha performanslı olabilir.

Tabi PreparedStatement her zaman kullanılacak diye bir şart yok. Örneğin bir uygulamamız olduğunu düşünelim ve sürekli farklı sorguların gönderildiğini düşünelim. Bu durumda Statement kullanmak daha mantıklı olabilir ama sürekli aynı sorgular üzerinde çalışıyorsak tabi ki PreparedStatement kullanmak daha akıllıca olacaktır.

Umarım sizi bu konu hakkında biraz olsun fikir sahibi yapabilmişimdir. Bir daha ki yazımda görüşmek üzere..

Java – Static Anahtar Kelimesi

Java programlama dilindeki en önemli anahtar kelimelerinden biri de static kelimesidir. Hatta bir çok kez karşılaşmışızdır bu kelimeyle ama tam olarak anlayamamışızdır. Bu yazımda elimden geldiğince static kelimesinin Java’da ne işe yaradığını anlatacağım ve kullanımı hakkında örnekler yapacağım.

Sınıf ve Nesne Değişkenleri

Bir sınıf oluşturduğumuzda genellikle ilk önce değişkenlerimizi tanımlarız. Bu tanımladığımız değişkenler aslında o sınıftan oluşturduğumuz her nesne için ayrı ayrı oluşturulurlar. Mesela araba adında bir sınıfımızın olduğunu düşünelim ve bu sınıfa ait plaka, model yılı ve marka adında değişkenlerimiz olsun. Bu değişkenler araba nesnelerine özgüdür. Yani, üç tane arabamız olduğunu düşünürsek bellekte her arabamız için ayrı ayrı plaka, model yılı ve marka bilgileri tutulmaktadır. Bu yüzden bu değişkenlere nesne değişkeni de diyebiliriz. Bazen bunu aşmak isteriz ve aynı sınıfa ait nesnelerden bağımsız değişkenlerde yaratmak isteriz. Bu yaratacağımız değişkenlere de sınıf değişkeni denir. İşte static kavramı burda devreye giriyor.

Static anahtar kelimesini kullanarak tanımladığımız değişkenler sınıf değişkeni olarak adlandırılır. Mesela yukarıda anlattığım örneğe bağlı olarak araba sayısı diye bir değişken yaratabiliriz. Bu değişken bize o sınıftan kaç tane araba yaratıldığı bilgisini versin. Böyle olması için bu değişkenimizi static olarak tanımlamalıyız. Sınıf(static) değişkenleri o sınıftan oluşan herhangi bir nesneye özgü değil, sınıfa özgü değişkenlerdir ve sınıfa ait bilgileri taşırlar. İstediğimiz kadar nesne tanımlayalım farketmez sınıf değişkenleri bellekte bir kere yer kaplarlar. Nesne değişkenleri ise oluşturulan nesne kadar bellekte yer kaplarlar.

Static değişken kavramını anlatan örnek olarak küçük bir program yazalım.

static_araba

Yukarıdaki kodda araba sınıfımızdan oluşturacağımız nesnelere ait değişkenler tanımladık. Bir tanede araba_sayisi adında nesnelerden bağımsız sınıf değişkeni tanımladık. Bu değişkenimizin değeri Araba sınıfından her nesne yarattığımızda artacak.

Şimdi bir de main sınıfımıza bakalım.

main_static

Çalıştırdığımızda aşağıdaki çıktıyı alırız.

cikti

Gördüğünüz üzere başlangıçtaki araba sayımız sıfırdır çünkü hiç araba yaratmadık. İki araba nesnesi yaratıldığında da iki sonucunu ekranda görmüş olduk. Static değişkenleri çıktıdan da anlayacağınız gibi hem sınıf adı ile hem de nesne referansları ile çağırabilirsiniz. Hepsinde de aynı çıktıyı alırsınız. Ben sınıf adı ile çağırmanızı tavsiye ederim kodun anlaşılabilirliği açısından.

Static Metodlar

Tabi ki static kelimesinin kullanımı sadece değişkenlerle sınırlı değildir. Metodlarla da kullanılabilir. Şimdi bu metodlara bakalım.

Normalde bir sınıftaki bir metodu çağırmak istiyorsak o sınıfın nesnesi üzerinden çağırırız. Nesnelerden bağımsız değişkenler yaratabildiğimiz gibi bağımsız metodlar da yaratabiliriz. Bunun için static anahtar kelimesini kullanırız. Bu metodları çağırabilmek için nesne oluşturmamız gerekmez ve direk sınıf üzerinden çağırabiliriz.

Şimdi önceki örneğe bağlı olarak şu koda bakalım.

metod_araba

Gördüğünüz gibi araba_sayisi değişkeni private static olarak tanımlanmıştır ve araba sayısı sonucunu döndüren static bir metod tanımlanmıştır. Bu sefer araba sayisi değişkenine static metodumuz üzerinden erişeceğiz.

Şimdi aşağıdaki koda bakalım.

main_metod

Kodun çıktısı :

cikti_metod

Araba sınıfımız içindeki metod static metod olduğu için bu sınıfın herhangi bir nesnesini oluşturmadan direk çağırmamız mümkündür. Tabi ki static değişkenlerde de olduğu gibi bu metodları nesneler üzerinden de çağırabiliriz ancak bu kodun anlaşılabilirliği açısından tavsiye edilmez.

Şunu da hatırlatmakta fayda var; static metodlar içinden static olmayan bir öğeye erişemeyiz. Bu aslında static metodların en önemli kuralıdır.

Static Bloklar

Static bloklar; static değişkenlere ilk değer atamasını yapmak için kullanılan kod bloklarıdır. Bunlara “static initializer” denmektedir. Bu bloklar static değişkenler belleğe yüklendikten hemen sonra çalıştırılırlar. JVM(Java Virtual Machine), o sınıfa ait bir nesne oluşturmadan önce static blokların çalışmasını garanti eder.

Şimdi şu koda bakalım.

blok

Yukarıdaki koda baktığımızda static blok içerisinde 10 adet sayıdan oluşan bir dizi oluşturulduğunu ve bu dizinin her bir elemanına 0 ile 99 arasında random değerler atandığını görüyoruz. Bu blok sayesinde dizi değişkeni yaratıldığı anda 10 adet rastgele sayı ile doldurulmaktadır. Static bloklar içerisinde static metodlarda olduğu gibi static olmayan öğelere erişmem mümkün değildir.

Başka bir yazıda görüşmek üzere..

Java – Timer Kullanımı

Merhaba arkadaşlar. Bu yazımda Java’nın Timer sınıfı üzerinde duracağım. İlk önce Timer sınıfının ne için kullanıldığını anlatalım.

Timer sınıfı; bir kod bloğunun ne zaman veya ne sıklıkta çalışacağını belirlemek için kullanılır. Timer sınıfını kullanabilmek için aşağıdaki paketi import etmemiz gerekir.

java.util.Timer

Timer sınıfından bir nesneyi aşağıdaki yapılandırıcılar ile yaratabiliriz.

Timer()
Timer nesnesi yaratır.

Timer(String name)
Timer nesnesini bizim belirleyeceğimiz özel bir adıyla yaratır.

Timer sınıfından yaratılmış bir nesne aşağıdaki metodlar ile kullanılabilir.

void cancel()
Timer’ı sona erdirir.

int purge()
Sona erdirilen tüm görevleri ilgili timer nesnesinin görev kuyruğundan kaldırır.

void schedule(TimerTask task, Date time)
Belirtilen görevin hangi zamanda çalışacağını belirler.

void schedule(TimerTask task, Date firstTime, long period)
Belirtilen görevi hangi zamanda başlatacağını ve ne sıklıkla çalışacağını belirler.

void schedule(TimerTask task, long delay)
Belirtilen görevi ne kadarlık bir gecikmeyle başlayacağını zamanlar.

void schedule(TimerTask task, long delay, long period)
Belirtilen görevi ne kadarlık bir gecikmeyle başlayacağını ve ne sıklıkla çalışacağını belirler.

void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
Belirtilen görevi hangi zamanda başlatacağını ve hangi sabit oranlı periyodlar ile çalışacağını belirler.

void scheduleAtFixedRate(TimerTask task, long delay, long period)
Belirtilen görevi ne kadarlık bir gecikme ile başlayacağını ve hangi sabit oranlı periyodlar ile çalışacağını zamanlar.

Örnek olarak 5 den geriye sayan bir program yapalım. 0 olduğunda da tekrar başa dönsün.

Programın çıktısı aşağıdaki gibidir.

timer