it-swarm-id.com

(tidak) Properti di Jawa?

Jadi, saya sengaja membuat sendiri Java n00b sampai saat ini, dan paparan nyata pertama saya membuat kejutan kecil: Java tidak memiliki properti gaya C #!

Ok, saya bisa hidup dengan itu. Namun, saya juga dapat bersumpah bahwa saya telah melihat kode pengambil properti/penyetel di Jawa dalam satu basis kode, tetapi saya tidak ingat di mana. Bagaimana itu dicapai? Apakah ada ekstensi bahasa untuk itu? Apakah ini terkait dengan NetBeans atau sesuatu?

53
Ishmaeel

Ada pola "standar" untuk getter dan setter di Jawa, yang disebut properti Bean . Pada dasarnya setiap metode yang dimulai dengan get, tanpa argumen dan mengembalikan nilai, adalah pengambil properti untuk properti yang disebut sebagai sisa nama metode (dengan huruf awal yang lebih kecil). Demikian juga set menciptakan setter metode void dengan argumen tunggal.

Sebagai contoh:

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

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

Sebagian besar IDE Java akan menghasilkan metode ini untuk Anda jika Anda memintanya (di Eclipse semudah memindahkan kursor ke bidang dan menekan ctrl-1, lalu memilih opsi dari daftar).

Untuk apa nilainya, untuk keterbacaan Anda dapat menggunakan is dan has sebagai ganti get untuk properti tipe boolean juga, seperti pada:

public boolean isAwesome();

public boolean hasAwesomeStuff();
61
Calum

Saya terkejut bahwa tidak ada yang menyebutkan proyek lombok

Ya, saat ini tidak ada properti di Jawa. Ada beberapa fitur yang hilang juga.
Tapi, untungnya kita punya proyek lombok yang sedang berusaha memperbaiki situasi. Itu juga semakin populer setiap hari.

Jadi, jika Anda menggunakan lombok:

@Getter @Setter int awesomeInteger = 5;

Kode ini juga akan menghasilkan getAwesomeInteger dan setAwesomeInteger. Jadi sangat mirip dengan C # properti yang diimplementasikan otomatis .

Anda bisa mendapatkan info lebih lanjut tentang getter dan setter lombok di sini .
Anda pasti harus memeriksa fitur lainnya juga . Favorit saya adalah: 

Lombok terintegrasi dengan IDE, sehingga akan menunjukkan metode yang dihasilkan seperti jika ada (saran, konten kelas, buka deklarasi dan refactoring).
Satu-satunya masalah dengan lombok adalah bahwa programmer lain mungkin tidak mengetahuinya. Anda selalu dapat delombok kode tetapi itu lebih merupakan solusi daripada solusi.

"Dukungan Properti Java" diusulkan untuk Java 7, tetapi tidak membuatnya menjadi bahasa.

Lihat http://tech.puredanger.com/Java7#property untuk tautan dan info lebih lanjut, jika berminat.

6
Cheekysoft

Konvensi kacang adalah menulis kode seperti ini:

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

Di beberapa bahasa lain di JVM, mis., Groovy, Anda mendapatkan properti yang dapat ditimpa mirip dengan C #, mis.,

int foo

yang diakses dengan .foo sederhana dan memanfaatkan implementasi default getFoo dan setFoo yang dapat Anda atur seperlunya.

6
Hank Gay
public class Animal {

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

Ini adalah sesuatu seperti properti C #. Ini http://projectlombok.org/

6
dantuch

Anda mungkin tidak memerlukan awalan "get" dan "set", agar lebih mirip properti, Anda dapat melakukannya seperti ini:

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

Sebagian besar IDE untuk Java akan secara otomatis menghasilkan kode pengambil dan penyetel untuk Anda jika Anda menginginkannya. Ada beberapa konvensi yang berbeda, dan IDE seperti Eclipse akan memungkinkan Anda untuk memilih mana yang ingin Anda gunakan, dan bahkan membiarkan Anda menentukan sendiri.

Eclipse bahkan menyertakan refactoring otomatis yang akan memungkinkan Anda untuk membungkus sebuah properti di pengambil dan penyetel dan itu akan memodifikasi semua kode yang mengakses properti secara langsung, untuk membuatnya menggunakan pengambil dan/atau penyetel.

Tentu saja, Eclipse hanya dapat memodifikasi kode yang diketahuinya - setiap dependensi eksternal yang Anda miliki dapat dipatahkan oleh refactoring tersebut.

3
Bill Michell

Pengalaman Java saya juga tidak setinggi itu, jadi siapa pun merasa bebas untuk mengoreksi saya. Tetapi AFAIK, konvensi umum adalah menulis dua metode seperti:

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

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

Saya baru saja merilis anotasi Java 5/6 dan prosesor anotasi untuk membantu ini.

Lihat http://code.google.com/p/javadude/wiki/Annotations

Dokumentasinya agak ringan sekarang, tetapi quickref harus menyampaikan ide.

Pada dasarnya ini menghasilkan superclass dengan getter/setter (dan banyak opsi pembuatan kode lainnya).

Kelas sampel mungkin terlihat seperti

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

Ada lebih banyak sampel yang tersedia, dan tidak ada dependensi runtime dalam kode yang dihasilkan.

Kirimkan saya email jika Anda mencobanya dan temukan manfaatnya! -- Scott

1

Jika Anda menggunakan Eclipse maka ia memiliki kemampuan untuk secara otomatis menghasilkan metode pengambil dan penyetel untuk atribut internal, itu dapat menjadi alat yang berguna dan menghemat waktu.

1
TK.

Tidak ada kata kunci properti di Jawa (seperti Anda dapat menemukannya di C #) cara terdekat untuk memiliki 1 pengambil kata/penyetel adalah seperti di C++:

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

Seperti yang disebutkan sebelumnya untuk Eclipse, lingkungan pengembangan terintegrasi (IDE) sering dapat membuat metode pengakses secara otomatis.

Anda juga dapat melakukannya menggunakan NetBeans. 

Untuk membuat metode accessor untuk kelas Anda, buka file kelas, lalu klik kanan di mana saja di editor kode sumber dan pilih perintah menu Refactor, Encapsulate Fields. Dialog terbuka. Klik Pilih Semua, lalu klik Refactor . Voa,

Semoga berhasil,

0
levteck