Java Record
Java’da record tanımları çıkmasıyla boilerplate kod yazımını nasıl daha aza indirgeyebiliriz bunu örnekleyeme çalışacağız.
Java’daki record veri odaklı özel bir class tanımıdır ve boilerplate(basma kalıp) kod yazımını azaltmak için vardır. Tabii ki biz yazmasak da
compiler bizim yerimize bunu ekliyor olacak.
Örnek record tanımı ve kullanımı:
1 2 3 4 5 6 |
public record Crane(int numberEggs, String name) { } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Test { public static void main(String[] args) { var mommy = new Crane(4, "Cammy"); System.out.println(mommy.numberEggs()); //4 System.out.println(mommy.name()); //Cammy var mommy1 = new Crane("Bilisimio",5); //does not compile mommy.name = "new mommy"; //does not compile } } |
Biz methodları tanımlamasak da bunların var olduğuna inanıyoruz. Peki nerdeler?
1 2 3 4 5 6 |
List.of(mommy.getClass().getDeclaredMethods()).forEach(System.out::println); List.of(mommy.getClass().getDeclaredConstructors()).forEach(System.out::println); |
1 2 3 4 5 6 7 8 9 10 |
public java.lang.String records.Crane.name() public final boolean records.Crane.equals(java.lang.Object) public final java.lang.String records.Crane.toString() public final int records.Crane.hashCode() public int records.Crane.numberEggs() public records.Crane(int,java.lang.String) |
Gördüğümüz üzere bizim yerimize equals(), toString(), hashCode() methodları, record tanımında yaptığımız sırada bir constructor ve field’lara ulaşmak için methodlar mevcut.
Immutable Record
Yukarıdaki hem method listesinden hem de compile olmayan koddan anlayacağımız üzere record’ların setter methodları yok.
Record özellikleri aynı zamanda final yani constructor’da oluşturulduktan sonra değiştiremezsiniz.
1 2 3 4 5 6 |
public final record Crane(int numberEggs, String name) { } |
Yukarıdaki record tanımında bulunan final keyword’ü gereksizdir. Ayrıca buradan anlayacağımız üzere enum’lar gibi record’ları da extend edemeyiz.
Constructor Overloading
Aşağıdaki gibi record tanımından bağımsız constructor overloading işlemi gerçekleştirebiliriz. Fakat constructor’ın ilk satırı this methodu ile başka bir constructor methodunu çağırmalıdır.
1 2 3 4 5 6 7 8 9 10 |
public record Crane(int numberEggs, String name) { public Crane(int numberEggs, String name, String nickName) { this(numberEggs, name + " " + nickName); } } |
Compact Constructor
Compact constructor, bir record tanımındaki parametreler ile contructor oluşturamacağımız için özel bir constructor tipi. Bu sayede gerekli validasyonları yapabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public record Crane(int numberEggs, String name) { static int DEFAULT_EGG = 10; public Crane { if (numberEggs < 1){ throw new IllegalArgumentException(); } name = name.toLowerCase(Locale.of("tr","TR")); } } |
Kaynak;
OCP Study Guide – Scott Selikoff & Jeanne Boyarsky
Faydalı olması dileğiyle.