Kayıt, Java'ya veri sınıflarını doğru şekilde uygulama yeteneği sağlar ve veri sınıflarını uygulamak için uzun kod yazma ihtiyacını ortadan kaldırır. Java 14'teki kayıtların yeni özelliklerine bir göz atalım.
Yazar | Nathan Esquenazi
Çevirmen | Crescent Moon, sorumlu editör | Guo Rui
Aşağıdaki çeviridir:
Java 14 resmi olarak Mart 2020'de piyasaya sürülecek. Java, yeni sürümün yayın döngüsü olarak 6 ay sürüyor .. Önceki sürümde olduğu gibi, JDK 14'ün dilin kendisine ve JVM düzeyine bazı yeni özellikler getirmesi bekleniyor.
Özellikler listesine bakarsak, geliştiricilerin dört gözle beklediği bazı dil özelliklerini göreceğiz: kayıtlar, anahtar ifadeleri (JDK 13'te var, ancak yalnızca önizleme modunda), kalıp eşleştirme. Daha ilginç kayıt özelliklerinden birine bir göz atalım.
Ön koşul
OpenJDK web sitesinden (https://jdk.java.net/14/) JDK 14'ün erken önizleme sürümüne ihtiyacımız var.
Rekor nedir?
Kayıt, saf verileri depolamak için kullanılan özel bir tür olan "veri türü" anlamına gelir. Kotlin'in veri sınıfları gibi diğer dillerde de benzer kayıt yapıları mevcuttur. Türün bir kayıt olarak bildirilmesiyle amaç, tür aracılığıyla ifade edilebilir, yani yalnızca veriler ifade edilir. Kayıtları bildirmek için sözdizimi, genellikle eşittir ve hashCode (genellikle "ortak şablon" kodu olarak adlandırılır) gibi temel Nesne yöntemlerini uygulamaya ihtiyaç duyan sıradan sınıfları kullanmaktan çok daha basittir. Model sınıfları (ORM aracılığıyla kalıcı) veya veri aktarım nesneleri (DTO'lar) gibi şeyleri modellerken kayıt iyi bir seçimdir.
Java dilinde kayıtların nasıl uygulandığını öğrenmek istiyorsanız, numaralandırılmış türlere başvurabilirsiniz. Numaralandırma ayrıca özel anlamlara ve zarif sözdizimine sahip bir sınıftır. Kayıtlar ve numaralandırmalar hala sınıflar olduğundan, sınıflarda bulunan özelliklerin çoğu korunur, bu nedenle kayıtlar tasarım basitliği ile esneklik arasında bir denge sağlar.
Kayıt, bir önizleme dili özelliğidir, yani bu özellik tam olarak desteklenmesine rağmen, standart JDK'ya resmi olarak girilmemiştir ve yalnızca etkinleştirme bayrağıyla kullanılabilir. Önizleme dili özelliği gelecekteki sürümlerde güncellenebilir veya kaldırılabilir. Anahtar türü benzerdir ve gelecek sürümlerde sonsuza kadar sürebilir.
Kaydedilmiş bir örnek
Aşağıda bir kayıt örneği verilmiştir:
paket örnekleri;
kişi kaydı (String firstName, String lastName) {}
Tanımladık Kişi Nesne, içerir İsim ile Soyadı İki bileşen için kaydedilen gövde boştur.
Sonra onu derliyoruz. Dikkat --Önizlemeyi etkinleştir Seçenekler.
javac --enable-önizleme --release 14 Person.java
Not: Person.java, önizleme dili özelliklerini kullanır.
Not: -Xlint ile yeniden derleyin: ayrıntılar için önizleme.
Gizemini ortaya çıkarın
Daha önce de belirtildiği gibi, kayıt yalnızca verileri kaydetmek ve açığa çıkarmak için bir sınıftır.
Ardından, javap aracı tarafından oluşturulan bayt koduna bir göz atalım:
javap -v -p Kişi.class
Bayt kodu:
Sınıf dosyası örnekleri / Person.class
Son değiştirilme tarihi: 22 Ara 2019; boyut 1273 bayt
SHA-256 sağlama toplamı 6f1b325121ca32a0b6127180eff29dcac4834f9c138c9613c526a4202fef972f
"Person.java" dan derlenmiştir
son sınıf örnekleri. Person, java.lang.Record'u genişletir.
alt sürüm: 65535
ana sürüm: 58
bayraklar: (0x00 30 ) ACC_FINAL, ACC_SUPER
this_class: # 8 // örnekler / Kişi
super_class: # 2 // java / dil / Kayıt
arabirimler: 0, alanlar: 2, yöntemler: 6, öznitelikler: 4
Sabit havuz:
# 1 = Methodref # 2. # 3 // java / lang / Record. "": V
# 2 = Sınıf # 4 // java / lang / Kayıt
# 3 = NameAndType # 5: # 6 // "": V
# 4 = Utf8 java / lang / Kayıt
# 5 = Utf8
# 6 = Utf8 V
# 7 = Alanref # 8. # 9 // örnekler / Kişi.firstName: Ljava / dil / Dize;
# 8 = Sınıf # 10 // örnekler / Kişi
# 9 = NameAndType # 11: # 12 // firstName: Ljava / dil / String;
# 10 = Utf8 örnekleri / Kişi
# 11 = Utf8 firstName
# 12 = Utf8 Ljava / dil / Dize;
# 13 = Alan referans # 8. # 14 // örnekler / Kişi.lastName: Lav / dil / Dize;
# 14 = NameAndType # 15: # 12 // lastName: Ljava / dil / Dize;
# 15 = Utf8 lastName
# 16 = Alan referans # 8. # 9 // örnekler / Kişi.firstName: Ljava / dil / Dize;
# 17 = Alan referans # 8. # 14 // örnekler / Kişi.lastName: Ljava / dil / String;
# 18 = InvokeDynamic # 0: # 19 // # 0: toString: (Lexamples / Kişi;) Ljava / lang / String;
# 19 = NameAndType # 20: # 21 // toString: (Lexamples / Kişi;) Ljava / lang / String;
# 20 = Utf8 toString
# 21 = Utf8 (Sözcük Örnekler / Kişi;) Ljava / dil / Dize;
# 22 = InvokeDynamic # 0: # 23 // # 0: hashCode: (Lexamples / Kişi;) I
# 23 = NameAndType # 24: # 25 // hashCode: (Örnekler / Kişi;) I
# 24 = Utf8 hashCode
# 25 = Utf8 (Sözcük Örnekler / Kişi;) I
# 26 = InvokeDynamic # 0: # 27 // # 0: eşittir: (Lexamples / Person; Ljava / lang / Object;) Z
# 27 = NameAndType # 28: # 29 // şuna eşittir: (Lexamples / Person; Ljava / lang / Object;) Z
# 28 = Utf8 eşittir
# 29 = Utf8 (Sözcük Örnekler / Kişi; Ljava / dil / Nesne;) Z
# 30 = Utf8 (Lav / dil / Dize; Lav / dil / Dize;) V
# 31 = Utf8 Kodu
# 32 = Utf8 LineNumberTable
# 33 = Utf8 MethodParameters
# 34 = Utf8 Ljava / dil / Dize;
# 35 = Utf8 I
# 36 = Utf8 (Lav / dil / Nesne;) Z
# 37 = Utf8 Kaynak Dosyası
# 38 = Utf8 Person.java
# 39 = Utf8 Kaydı
# 40 = Utf8 BootstrapMethods
# 41 = MethodHandle 6: # 42 // REF_invokeStatic java / lang / runtime / ObjectMethods.bootstrap: (Ljava / lang / invoke / MethodHandles $ Lookup; Ljava / lang / String; Ljava / lang / invoke / TypeDescriptor; Lav / lang / Sınıf; Ljava / lang / String;