Apa perbedaan antara bidang, variabel, atribut, dan properti di POJO Java?

142

Ketika merujuk ke variabel pribadi internal POJO Java yang memiliki getter / setter, saya telah menggunakan istilah berikut:

  • bidang
  • variabel
  • atribut
  • Properti

Apakah ada perbedaan di atas? Jika demikian, apa istilah yang tepat untuk digunakan? Apakah ada istilah yang berbeda untuk digunakan ketika entitas ini bertahan?

Victor Lyuboslavsky
sumber

Jawaban:

117

Dari sini: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • bidang

    • Anggota data kelas. Kecuali ditentukan sebaliknya, bidang tidak statis.

  • Properti

    • Karakteristik objek yang dapat diatur pengguna, seperti warna jendela.

  • atribut

    • Tidak tercantum dalam daftar istilah di atas

  • variabel

    • Item data bernama oleh pengidentifikasi. Setiap variabel memiliki tipe, seperti int atau Object, dan cakupan. Lihat juga variabel kelas, variabel instan, variabel lokal.
Jahroy
sumber
27
Saya masih tidak mengerti perbedaan antara bidang dan properti?
Koray Tugay
1
@KorayTugay - Lihatlah bidang sebagai bagian data yang terkait dengan objek. Properti (bagi saya) adalah karakteristik objek yang terlihat (dan tampaknya bisa berubah) ke dunia luar.
jahroy
Berdasarkan hal di atas, apakah adil untuk mengatakan "Properti dan bidang adalah sama, kecuali properti adalah bidang yang dapat diselesaikan "?
jdurston
2
@ John - Mungkin berdasarkan hal di atas, yang, seperti disebutkan, adalah salinan / tempel dari Oracle. Secara pribadi saya akan membuat perbedaan bahwa properti dapat dilihat oleh publik dan mungkin bisa berubah, sedangkan sebuah bidang bisa menjadi bidang internal, privat yang hanya digunakan oleh kelas.
Jahroy
1
Saya pikir hal terbaik untuk ditekankan adalah bahwa keberadaan sebagai ladang dan properti tidak saling eksklusif. Dari cara jawaban ini diucapkan, untuk pengembang baru, sepertinya daftar hal-hal yang berbeda.
Kartik Chugh
89

Ya ada.

Variabel bisa lokal, bidang, atau konstan (walaupun ini secara teknis salah). Itu atribut seperti samar. Anda juga harus tahu bahwa beberapa orang suka memanggil variabel final non-statis (lokal atau instance)

" Nilai ". Ini mungkin berasal dari bahasa JVM FP yang baru muncul seperti Scala.

Field pada umumnya adalah variabel pribadi pada kelas instan. Bukan berarti ada pengambil dan penyetel.

Atribut adalah istilah yang tidak jelas. Dapat dengan mudah dikacaukan dengan XML atau Java Naming API. Cobalah untuk menghindari penggunaan istilah itu.

Properti adalah kombinasi pengambil dan penyetel.

Beberapa contoh di bawah ini

public class Variables {

    //Constant
    public final static String MY_VARIABLE = "that was a lot for a constant";

    //Value
    final String dontChangeMeBro = "my god that is still long for a val";

    //Field
    protected String flipMe = "wee!!!";

    //Property
    private String ifYouThoughtTheConstantWasVerboseHaHa;

    //Still the property
    public String getIfYouThoughtTheConstantWasVerboseHaHa() {
        return ifYouThoughtTheConstantWasVerboseHaHa;
    }

    //And now the setter
    public void setIfYouThoughtTheConstantWasVerboseHaHa(String ifYouThoughtTheConstantWasVerboseHaHa) {
        this.ifYouThoughtTheConstantWasVerboseHaHa = ifYouThoughtTheConstantWasVerboseHaHa;
    }

}

Ada banyak kombinasi lagi, tetapi jari-jari saya mulai lelah :)

Adam Gent
sumber
3
@ Chris Thompson Thats memanggil Eclipse dalam salah satu dialognya. Hai orang-orang Jawa. Apa yang bisa saya katakan. Itu tidak masuk akal.
Adam Gent
4
@AdamGent JAVA = Akronim Yang Tidak
Jelas Lainnya
@emory Yah itu oxymoron tua yang terkenal. Itu tidak ada yang spesifik untuk Java, bahwa "masalah" kembali sampai setidaknya C dan mungkin lebih lama .. jelas tidak ada yang menghentikan Anda dari menyebutnya hanya "konstan"
Voo
@ AdamGent Tidak serius, hanya memberi Anda waktu yang sulit ;-)
Chris Thompson
1
Penjelasan yang baik sambil mengolok-olok bagaimana nama pengenal bisa menjadi sangat panjang (dan mereka sering menjadi sangat lama).
sargas
5

Jika pertanyaan Anda diminta dengan menggunakan JAXB dan ingin memilih yang benar XMLAccessType, saya memiliki pertanyaan yang sama. JAXB Javadoc mengatakan bahwa "field" adalah variabel instance non-statis, non-transient. "Properti" memiliki pasangan pengambil / penyetel (jadi itu harus variabel pribadi). "Anggota publik" adalah publik, dan karena itu mungkin konstan. Juga di JAXB, "atribut" merujuk ke bagian dari elemen XML, seperti pada <myElement myAttribute="first">hello world</myElement>.

Tampaknya "properti" Java, secara umum, dapat didefinisikan sebagai bidang dengan setidaknya pengambil atau metode publik lainnya yang memungkinkan Anda untuk mendapatkan nilainya. Beberapa orang juga mengatakan bahwa properti perlu memiliki setter. Untuk definisi seperti ini, konteks adalah segalanya.

jagoan309
sumber
5

Dietel dan Dietel memiliki cara yang bagus untuk menjelaskan bidang vs variabel.

“Bersama-sama variabel statis kelas dan variabel instan dikenal sebagai bidangnya.” (Bagian 6.3)

"Variabel harus dinyatakan sebagai bidang hanya jika mereka diperlukan untuk digunakan di lebih dari satu metode kelas atau jika program harus menyimpan nilai-nilai mereka antara panggilan ke metode kelas." (Bagian 6.4)

Jadi bidang kelas adalah variabel statis atau instance - yaitu dideklarasikan dengan ruang lingkup kelas.

Referensi - Dietel P., Dietel, H. - Java ™ Cara Memprogram (Objek Awal), Edisi Kesepuluh (2014)

Mangga
sumber
3

Jika Anda mengambil petunjuk dari Hibernate:

Hibernate membaca / menulis status Object dengan bidangnya. Hibernate juga memetakan properti gaya Java Bean ke DB Schema. Hibernasi, Akses bidang untuk memuat / menyimpan objek. Jika pemetaan dilakukan oleh properti, hibernate menggunakan pengambil dan penyetel.

Itu adalah Enkapsulasi yang membedakan cara di mana Anda memiliki pengambil / setter untuk bidang dan itu disebut properti, dengan itu dan kami menyembunyikan struktur data yang mendasari properti itu dalam setMethod, kami dapat mencegah perubahan yang tidak diinginkan di dalam setter. Semua enkapsulasi adalah singkatan dari ...

Bidang harus dideklarasikan dan diinisialisasi sebelum digunakan. Sebagian besar untuk penggunaan internal kelas.

Properti dapat diubah oleh setter dan mereka diekspos oleh getter. Di sini harga lapangan memiliki pengambil / penentu sehingga merupakan properti.

class Car{
 private double price;
 public double getPrice() {…};
 private void setPrice(double newPrice) {…};
}

<class name="Car" …>
<property name="price" column="PRICE"/>
</class>

Demikian pula dengan menggunakan bidang , [Dalam hibernasi itu adalah cara yang disarankan untuk PETA menggunakan bidang, di mana private int id; dianotasi @Id, tetapi dengan Properti Anda memiliki kendali lebih besar]

class Car{
  private double price;
}
<class name="Car">
<property name=" price" column="PRICE" access="field"/>
</class>

Java doc mengatakan: Field adalah data anggota suatu kelas. Bidang adalah variabel contoh tidak statis dan tidak transien. Field pada umumnya adalah variabel pribadi pada kelas instan.

krishna vimal
sumber
2

Variabel terdiri dari bidang dan non-bidang.

Bidang dapat berupa:

  1. Bidang statis atau
  2. bidang non-statis juga disebut instantiasi misalnya x = F ()

Non-bidang dapat berupa:

  1. variabel lokal, analog bidang tetapi di dalam metode daripada di luar semuanya, atau
  2. parameter misalnya y dalam x = f (y)

Sebagai kesimpulan, perbedaan utama antara variabel adalah apakah mereka adalah bidang atau non-bidang, yang berarti apakah mereka berada di dalam suatu metode atau di luar semua metode.

Contoh Dasar (permisi untuk sintaks saya, saya hanya pemula)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}
the_prole
sumber
1

Sebenarnya kedua istilah ini sering digunakan untuk mewakili hal yang sama, tetapi ada beberapa situasi luar biasa. Bidang dapat menyimpan keadaan suatu objek. Juga semua bidang adalah variabel. Jadi jelas bahwa bisa ada variabel yang bukan bidang. Jadi melihat ke dalam 4 jenis variabel (variabel kelas, variabel instan, variabel lokal dan variabel parameter) kita dapat melihat bahwa variabel kelas dan variabel instan dapat mempengaruhi keadaan suatu objek. Dengan kata lain jika variabel kelas atau instance berubah, keadaan objek berubah. Jadi kita dapat mengatakan bahwa variabel kelas dan variabel instan adalah bidang sedangkan variabel lokal dan variabel parameter tidak.

Jika Anda ingin memahami lebih dalam, Anda dapat mengunjungi sumber di bawah ini: -

http://sajupauledayan.com/java/fields-vs-variables-in-java

Sagar Patel
sumber
0

Pertanyaannya sudah lama tetapi perbedaan penting lainnya antara variabel dan bidang adalah bahwa bidang mendapatkan nilai default ketika dideklarasikan. Variabel, di sisi lain, harus diinisialisasi.

Peter Clause
sumber
Bagaimana dengan sebuah properti?
Koray Tugay
0

Pemahaman saya seperti di bawah ini, dan saya tidak mengatakan bahwa ini 100% benar, saya mungkin juga salah ..

Sebuah variabel adalah sesuatu yang Anda menyatakan, yang dapat dengan perubahan default dan memiliki nilai yang berbeda, tapi itu juga bisa secara eksplisit dikatakan final. Di Jawa itu adalah:

public class Variables {

    List<Object> listVariable; // declared but not assigned
    final int aFinalVariableExample = 5; // declared, assigned and said to be final!

    Integer foo(List<Object> someOtherObjectListVariable) {
        // declare..
        Object iAmAlsoAVariable;

        // assign a value..
        iAmAlsoAVariable = 5;

        // change its value..
        iAmAlsoAVariable = 8;

        someOtherObjectListVariable.add(iAmAlsoAVariable);

        return new Integer();
    }
}

Jadi pada dasarnya, variabel adalah segala sesuatu yang dideklarasikan dan dapat menyimpan nilai. Metode foo di atas mengembalikan variabel misalnya .. Ia mengembalikan variabel tipe Integer yang menyimpan alamat memori Integer baru (); Segala sesuatu yang Anda lihat di atas juga variabel, listVariable, aFinalVariableExample dan dijelaskan di sini:

Bidang adalah variabel yang cakupannya lebih jelas (atau konkret). Variabel yang kembali dari ruang lingkup metode foo tidak jelas dalam contoh di atas, jadi saya tidak akan menyebutnya bidang. Di sisi lain, iAmAlsoVariable adalah bidang "lokal", dibatasi oleh ruang lingkup metode foo, dan listVariable adalah bidang "instance" di mana ruang lingkup bidang (variabel) dibatasi oleh lingkup objek.

Properti adalah bidang yang dapat diakses / dimutasi. Setiap bidang yang memperlihatkan pengambil / penyetel adalah properti.

Saya tidak tahu tentang atribut dan saya juga ingin mengulangi bahwa ini adalah pemahaman saya tentang variabel, bidang, dan properti apa.

Koray Tugay
sumber
0
  • variable- Alamat penyimpanan bernama. Setiap variabel memiliki tipe yang mendefinisikan ukuran memori, atribut, dan perilaku. Ada untuk jenis variabel Java: class variable, instance variable, local variable,method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field- variabel anggota atau anggota data. Itu adalah variabledi dalam class( class variableatau instance variable)

  • attribute- dalam beberapa artikel Anda dapat menemukan bahwa attributeitu adalah objectrepresentasi dari class variable. Objectberoperasi dengan attributesyang mendefinisikan seperangkat karakteristik.

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+ dibatasi getter/setter. Ini memiliki sintaks lapangan tetapi menggunakan metode di bawah tenda. Javatidak mendukungnya dalam bentuk murni. Lihatlah Objective-C, Swift,Kotlin

Contohnya Kotlincontoh:

//field - Backing Field
class Person {
    var name: String = "default name"
        get() = field
        set(value) { field = value }
}

//using
val person = Person()
person.name = "Alex"    // setter is used
println(person.name)    // getter is used

[Variabel cepat, properti]

yoAlex5
sumber