Lombok Getter / Setter vs Java 14 kaydı


10

Lombok projesini seviyorum ama bu günlerde java 14'ün bazı yeni özelliklerini okuyup deniyorum.

Yeni özelliğin içinde, şu işlevlere zaten yerleşik olan bir sınıf oluşturmaya izin veren kayıt anahtar sözcüğü vardır: yapıcı, özel son alanlar, erişimciler, eşittir / hashCode, getters, toString yöntemleri.

Şimdi sorum şu: Lombok özelliğine güvenmek daha iyidir ya da kayıt işlevini kullanmaya başlamalıyız:

Bunu kullanmak daha iyidir:

record Person (String name, String surname) {}

yada bu:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

Her iki yaklaşımın da artıları ve eksileri nelerdir?


Bir kere, recordJavaBeans tarzı alıcılar ve ayarlayıcılar beklemek şeyler için çalışmaz.
Mark Rotteveel

2
Rotteveel'in yorumu, bir kayıttaki özellik erişimcisi yönteminin özelliğin aynı adı olarak adlandırılmasıdır. Yani, alice.phoneNumber()JavaBeans yerine önek kuralı get, olduğu gibi alice.getPhoneNumber().
Basil Bourque

1
Bu recordözellik bir önizleme özelliğidir , henüz üretimde kullanılmaya hazır değildir .
Basil Bourque

Kayıtların sınıflarla karşılaştırıldığında çok fazla kısıtlaması vardır, örneğin bir kayıt başka bir kaydı veya sınıfı genişletemez, daha fazla ayrıntı için bu JEP openjdk.java.net/jeps/359'daki kısıtlamalar bölümüne bakın
NAIT

Yanıtlar:


9

Lombok ve recordJava dilinin özelliği, farklı şeyler için farklı araçlardır. Bazı yüzeysel çakışma var, ama bunun dikkatinizi dağıtmasına izin vermeyin.

Lombok büyük ölçüde sözdizimsel kolaylık ile ilgilidir; bilinen bazı yararlı kod kalıpları ile önceden yüklenmiş bir makro işlemcidir. Herhangi bir anlambilim sunmaz; ek açıklamalarla kodda ayarladığınız bazı düğmelere göre desenleri otomatik hale getirir. Lombok tamamen veri taşıma sınıflarını uygulamanın rahatlığıyla ilgilidir.

Kayıtlar semantik bir özelliktir; onlar nominal tuples . Bir semantik beyanda bulunarak Point olan bir tanımlama grubu arasında (int x, int y), derleyici bu durum açıklamasından, onun temsilini yanı inşaat, beyanı, eşitlik, sağlama ve dize olarak temsil protokolleri türetebilirsiniz. Anlambilimi taşıdıkları için, okuyucular ve çerçeveler de kayıtların API'sı konusunda daha yüksek bir güven ile mantıklı olabilir. (Bu sözdizimsel olarak da uygun olabilir; öyleyse, bu harika.)


1
+1 Brian Goetz: Bu da mevcut Lombok versiyonunu IDE'nize alabileceğinizi varsayıyor. Lombok, bir sınıf yorumunun verilmeyeceği daha hızlı kod okuma konusunda herhangi bir anlamlı avantaja sahip olup olmadığını merak ediyorum.
Gövde

4

Bir süredir bu kombinasyonla oynuyorum ve hafif uygulamayla aşağıdaki farklılıkları listeleyebildim:

Lombok

  • Kayıtlar henüz yayınlanmış bir özellik değildir ve yalnızca bir önizleme özelliğidir. Bu yüzden Lombok ile kalmak daha mantıklı.
  • Lombok'u hep birlikte ortadan kaldırmak için henüz güçlü bir araç değiller. Kütüphanenin sadece @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • Kendi kendine deneyimlenen, kayıtlara geçiş söz konusu olduğundaEqualsAndHashCode beklediğiniz gibi değildir .

kayıtlar

  • Farklı bir notta, nesne temsili gereksiniminiz bir "veri taşıyıcısı" ise, tam olarak gerçekleştirmek için ısıtıcı levha kodunu azaltmak için ek bir kütüphaneye güvenmeden, yine de Kayıtlardan faydalanabilirsiniz. Kesin bir not olarak bu blogun aşağıdakileri okumasının nedeni budur :

    Ayrıca, ekiplerin altta yatan modelin birçok elle kodlanmış uygulamasını ortadan kaldırmasına ve Lombok gibi kütüphanelere olan ihtiyacı azaltmasına veya kaldırmasına yardımcı olacaktır.

Tabii ki, günlük bazda, hangi projeyi takip edeceğinizi ve uygulayacağınızı seçmek her zaman akıllıca olacaktır.


Not - Şu anda her ikisini de sık sık kullanmak için bir kullanıcı olmak için daha fazla örnekle bunu güncel tutmaya çalışacağım.
Naman

3

Not: Bu yılbaşı notları yerine @Valuesınıfta kullanabilirsiniz . Bunun sınıfı sonlandırdığını ve tüm alanları hem özel hem de son haline getirdiğini ve size geri kalanını da verdiğini unutmayın. Bu, kayıtların ne olduğuna yakındır (onlar da kesindir ve içindeki tüm alanlar kesindir).

recordhala önizlemede, bu nedenle üretim kodu için, henüz uygun değil. Lombok kullan.

Kayıtlar önizlemeden çıktığında, daha karmaşıktır. Lombok FAR daha esnektir; tüm kodu yeniden yazmak zorunda kalmadan bazı yeni yönleriyle kolayca değiştirebilirsiniz (örneğin, equals ve hashCode yöntemini el yazısı yazmak zorunda kalmadan sınıfınıza bir 'genişletme' cümlesi ekleyebilirsiniz; bir şey kayıtlar size veremez). Lombok ayrıca size daha fazla özellik sunar: Örneğin, @Builderek açıklama ekleyerek bir oluşturucu ekleyebilirsiniz ; kayıtların yapabileceği bir şey değil.

Tasarladığınız sınıf için bunlardan herhangi birini kullanmanız pek olası değilse, kayıtları kullanırdım.

YASAL UYARI: Lombok Projesi'nin ana katkısıyım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.