it-swarm-tr.com

(no) Java'daki Özellikler?

Bu yüzden, yakın zamana kadar kendimi bir Java n00b ile korudum ve ilk gerçek riskim küçük bir şok oluşturdu: Java C # tarzı özelliklere sahip değil!

Tamam, bununla yaşayabilirim. Ancak, Java'da özellik kodlayıcı/ayarlayıcı kodunu tek bir kod tabanında gördüğüme yemin edebilirim, ancak nerede olduğunu hatırlayamıyorum. Bu nasıl başarıldı? Bunun için bir dil uzantısı var mı? NetBeans veya başka bir şeyle mi ilgili?

53
Ishmaeel

Java'da alıcılar ve ayarlayıcılar için "standart" bir kalıp var, Bean özellikleri . Temel olarak get ile başlayan, hiçbir argüman almayan ve bir değer döndürmeyen herhangi bir yöntem, yöntem adının geri kalanı (küçük harfli bir başlangıç ​​harfiyle) olarak adlandırılan bir özellik için bir özellik alıcıdır. Aynı şekilde set, tek bir argümanla bir void yöntemi belirleyicisi oluşturur.

Örneğin:

// Getter for "awesomeString"
public String getAwesomeString() {
  return awesomeString;
}

// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
  this.awesomeString = awesomeString;
}

Pek çok Java IDE size bunları sorarsanız bu yöntemleri üretecektir (Eclipse'de imleci bir alana taşımak ve ctrl-1'e basmak, ardından listeden seçeneği seçmek kadar basittir).

Değeri ne olursa olsun, okunabilirlik için, aşağıdaki gibi, boolean tipi özellikler için is yerine has ve get işlevlerini kullanabilirsiniz:

public boolean isAwesome();

public boolean hasAwesomeStuff();
61
Calum

Kimsenin project lombok 'dan bahsetmediğine şaşırdım.

Evet, şu anda Java'da özellik yok. Diğer bazı eksik özellikler de var.
Ancak, neyse ki, durumu iyileştirmeye çalışan project lombok cihazımız var. Aynı zamanda her geçen gün daha da popüler hale geliyor.

Yani, eğer lombok kullanıyorsanız:

@Getter @Setter int awesomeInteger = 5;

Bu kod getAwesomeInteger ve setAwesomeInteger 'ı da üretecektir. Bu yüzden C # otomatik uygulanan özelliklere oldukça benzer.

Lombok alıcıları ve ayarlayıcıları here hakkında daha fazla bilgi edinebilirsiniz.
Kesinlikle diğer özellikleri de kontrol etmelisiniz . 

Lombok, IDE'lerle iyi bir şekilde bütünleşmiştir, bu yüzden eğer varlarsa (öneri, sınıf içeriği, bildirgeye gitme ve yeniden düzenleme gibi) üretilen yöntemleri gösterecektir.
Lombok ile ilgili tek sorun, diğer programcıların bunu bilmemesi olabilir. Kodu her zaman delombok yapabilirsiniz, ancak bu bir çözümden çok bir geçici çözümdür.

Java 7 için "Java Property Support" önerildi, ancak dili kullanamadı.

İlgileniyorsanız, daha fazla bağlantı ve bilgi için http://tech.puredanger.com/Java7#property adresine bakın.

6
Cheekysoft

Fasulye sözleşmesi şöyle bir kod yazmaktır:

private int foo;
public int getFoo() {
    return foo;
}
public void setFoo(int newFoo) {
    foo = newFoo;
}

JVM'deki diğer dillerin bazılarında, örneğin Groovy'de, C # 'ya benzer şekilde geçersiz kılınabilir özellikler elde eder, örneğin

int foo

basit bir .foo ile erişilir ve gerektiğinde geçersiz kılabileceğiniz varsayılan getFoo ve setFoo uygulamalarını kullanır.

6
Hank Gay
public class Animal {

    @Getter @Setter private String name;
    @Getter @Setter private String gender;
    @Getter @Setter private String species;
}

Bu C # özellikleri gibi bir şey. Bu http://projectlombok.org/

6
dantuch

"Get" ve "set" öneklerine ihtiyacınız olmayabilir, özelliklerin daha çok benzemesini sağlamak için aşağıdakileri yapabilirsiniz:

public class Person {
    private String firstName = "";
    private Integer age = 0;

    public String firstName() { return firstName; } // getter
    public void firstName(String val) { firstName = val; } // setter

    public Integer age() { return age; } // getter
    public void age(Integer val) { age = val; } //setter

    public static void main(String[] args) {
        Person p = new Person();

        //set
        p.firstName("Lemuel");
        p.age(40);

        //get
        System.out.println(String.format("I'm %s, %d yearsold",
            p.firstName(),
            p.age());
    }
}
4
LEMUEL ADANE

Jeffrey Richter'ın kitabından CLR üzerinden C #: (Bence bu özelliklerin hala Java’ya eklenmemesinin sebepleri olabilir)

  • Bir özellik yöntemi bir istisna atabilir; sahaya erişim hiçbir zaman bir istisna atmaz.
  • Bir özellik, bir yönteme out veya ref parametresi olarak geçirilemez; bir alan olabilir. 
  • Bir özellik yönteminin yürütülmesi uzun zaman alabilir; alan erişimi her zaman derhal tamamlar. Özellikleri kullanmanın yaygın bir nedeni, iş parçacığını sonsuza kadar durdurabilen iplikçik eşitlemesi yapmaktır. Bu nedenle iş parçacığı eşitlemesi gerekiyorsa özellik kullanılmamalıdır. Bu durumda, bir yöntem tercih edilir .Ayrıca, sınıfınıza uzaktan erişilebiliyorsa (örneğin, sınıfınız System.MarshalByRefObject adresinden türetilmişse), özellik yöntemini çağırmak çok yavaş olacaktır ve bu nedenle. bir özellik için bir yöntem tercih edilir. Benim görüşüme göre, MarshalByRefObject 'den türetilen sınıflar hiçbir zaman özellik kullanmamalıdır.
  • Bir satırda birden çok kez çağrılırsa, bir özellik yöntemi her bir Zaman; bir alan her defasında aynı değeri döndürür. System.DateTime sınıfı, geçerli tarih ve saati döndüren bir salt okunur Now özelliğine sahiptir. Bu bilgiyi sorguladığınızda, farklı bir değer döndürür. Bu bir hatadır ve Microsoft, Sınıfa bir özellik yerine bir yöntem yaparak sınıfı düzeltmelerini ister. Environment 's TickCount özelliği bu hatanın bir başka örneğidir.
  • Bir özellik yöntemi gözlenebilir yan etkilere neden olabilir; sahaya erişim asla yapmaz. Diğer Kelimelerinde, bir tür kullanıcı, türünde farklı bir davranış fark etmeden seçtiği herhangi bir sırayı, türünde tanımladığı çeşitli özellikleri ayarlayabilmelidir.
  • Bir özellik yöntemi ek bellek gerektirebilir veya aslında nesnenin durumunun bir parçası olmayan bir nesneye başvuruda bulunabilir; bu nedenle, iade edilen nesnenin değiştirilmesinin orijinal nesne üzerinde hiçbir etkisi yoktur. Bir alanı sorgulamak, her zaman orijinal nesnenin durumunun bir parçası olduğu garantili olan bir nesneye yapılan başvuruyu döndürür. Bir kopyasını döndüren bir özellik İle çalışmak, geliştiriciler için oldukça kafa karıştırıcı olabilir ve bu özellik sıklıkla Belgelenmemiştir.
3
th1rdey3

Java için IDE'lerin çoğu, isterlerse sizin için otomatik olarak alıcı ve belirleyici kodunu üretecektir. Çok sayıda farklı kural vardır ve Eclipse benzeri bir IDE hangisini kullanmak istediğinizi seçmenize izin verir ve hatta kendinizinkini tanımlamanıza izin verir.

Eclipse, bir özelliği bir alıcı ve ayarlayıcıya sarmanıza izin verecek ve alıcıyı ve/veya ayarlayıcıyı kullanması için özelliğe doğrudan erişen tüm kodu değiştirecek olan otomatik yeniden düzenleme içerir.

Elbette, Eclipse yalnızca bildiği bir kodu değiştirebilir - bu tür bir yeniden düzenleme işleminden kırdığınız dış bağımlılıklar.

3
Bill Michell

Java deneyimim de o kadar yüksek değil, bu yüzden kimse beni düzeltmekte özgür. Ancak AFAIK, genel kongre böyle iki yöntem yazmaktır:

public string getMyString() {
    // return it here
}

public void setMyString(string myString) {
    // set it here
}
2
Mark Embling

Sadece Java 5/6 ek açıklamalarını ve bunun için bir ek açıklama işlemcisini serbest bırakıyorum.

Çıkış http://code.google.com/p/javadude/wiki/Annotations

Belgeler şu anda biraz hafif, ancak quickref bu fikri karşılıyor olmalı.

Temelde alıcıları/ayarlayıcıları (ve diğer birçok kod oluşturma seçenekleri) ile bir üst sınıf oluşturur.

Örnek bir sınıf gibi görünebilir

@Bean(properties = {
    @Property(name="name", bound=true),
    @Property(name="age,type=int.class)
})
public class Person extends PersonGen {
}

Daha birçok örnek var ve üretilen kodda çalışma zamanı bağımlılığı yok.

Eğer deneyip faydalı bulursanız, bana bir e-posta gönderin! -- Scott

1

Eclipse kullanıyorsanız, dahili nitelikler için otomatik olarak alıcı ve ayarlayıcı yöntemini oluşturma yeteneklerine sahiptir, kullanışlı ve zaman kazandıran bir araç olabilir.

1
TK.

Java'da bir özellik anahtar sözcüğü yoktur (C # 'de bulabileceğiniz gibi), 1 Word alıcısı/ayarlayıcısına sahip olmanın en yakın yolu C++' daki gibi

public class MyClass
{
    private int aMyAttribute;
    public MyClass()
    {
        this.aMyAttribute = 0;
    }
    public void mMyAttribute(int pMyAttributeParameter)
    {
        this.aMyAttribute = pMyAttributeParameter;
    }
    public int mMyAttribute()
    {
        return this.aMyAttribute;
    }
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1
1
Patrick PIGNOL

Eclipse için daha önce de belirtildiği gibi, entegre geliştirme ortamı (IDE) genellikle otomatik olarak erişim yöntemleri yaratabilir.

NetBeans kullanarak da yapabilirsiniz. 

Sınıfınız için erişimci metotları oluşturmak için bir sınıf dosyası açın, kaynak kod editöründe herhangi bir yere sağ tıklayın ve Refactor, Encapsulate Fields komutunu seçin Bir iletişim kutusu açılır. Tümünü Seç, ardından Refactor ..__ öğesini tıklayın.

İyi şanslar,

0
levteck