อะไรคือความแตกต่างระหว่างฟิลด์ตัวแปรแอตทริบิวต์และคุณสมบัติใน Java POJO


142

เมื่ออ้างถึงตัวแปรส่วนตัวภายในของ Java POJO ที่มี getters / setters ฉันใช้เงื่อนไขต่อไปนี้:

  • สนาม
  • ตัวแปร
  • คุณลักษณะ
  • คุณสมบัติ

มีความแตกต่างระหว่างข้างต้นหรือไม่? ถ้าใช่คำที่ถูกต้องคืออะไร มีคำอื่นที่จะใช้เมื่อมีการยืนยันเอนทิตีนี้หรือไม่?

คำตอบ:


117

จากที่นี่: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • สนาม

    • ข้อมูลสมาชิกของคลาส เว้นแต่จะระบุไว้เป็นอย่างอื่นเขตข้อมูลจะไม่คงที่

  • คุณสมบัติ

    • ลักษณะของวัตถุที่ผู้ใช้สามารถตั้งค่าเช่นสีของหน้าต่าง

  • คุณลักษณะ

    • ไม่ได้ระบุไว้ในอภิธานศัพท์ข้างต้น

  • ตัวแปร

    • รายการข้อมูลที่ตั้งชื่อโดยตัวระบุ ตัวแปรแต่ละตัวมีชนิดเช่น int หรือ Object และขอบเขต ดูเพิ่มเติมที่ตัวแปรคลาสตัวแปรอินสแตนซ์ตัวแปรโลคัล

27
ฉันยังไม่เข้าใจความแตกต่างระหว่างเขตข้อมูลและคุณสมบัติหรือไม่
Koray Tugay

1
@KorayTugay - ดูฟิลด์เป็นข้อมูลพื้นฐานที่เกี่ยวข้องกับวัตถุ คุณสมบัติ (สำหรับฉัน) เป็นลักษณะของวัตถุที่มองเห็นได้ (และแน่นอนว่าไม่แน่นอน) ต่อโลกภายนอก
jahroy

ตามข้างต้นก็จะมีความยุติธรรมที่จะบอก "คุณสมบัติและสาขาเหมือนกันยกเว้นคุณสมบัติเป็นตัวอย่างไฟล์ข้อมูล"?
jdurston

2
@John - อาจเป็นไปตามข้างต้นซึ่งดังที่กล่าวไว้เป็นสำเนา / วางจาก Oracle โดยส่วนตัวแล้วฉันจะสร้างความแตกต่างว่าทรัพย์สินสามารถมองเห็นได้ในที่สาธารณะและอาจไม่แน่นอนในขณะที่เขตข้อมูลอาจเป็นเขตข้อมูลภายในส่วนตัวที่ใช้โดยชั้นเรียนเท่านั้น
jahroy

1
ฉันคิดว่าสิ่งที่ดีที่สุดที่จะเกิดความเครียดคือการมีชีวิตอยู่ในฐานะที่เป็นทุ่งนาและทรัพย์สินไม่ได้เกิดขึ้นพร้อมกัน จากวิธีที่คำตอบนี้ถูกใช้ไปจนถึงนักพัฒนาใหม่ดูเหมือนว่ารายการสิ่งต่าง ๆ
Kartik Chugh

89

ใช่แล้ว

ตัวแปรอาจเป็นแบบโลคอลฟิลด์หรือค่าคงที่ (แม้ว่านี่จะผิดในทางเทคนิค) มันคลุมเครือเช่นแอตทริบิวต์ นอกจากนี้คุณควรรู้ว่าบางคนชอบที่จะเรียกตัวแปรสุดท้ายที่ไม่คงที่ (ท้องถิ่นหรือตัวอย่าง)

" ค่า " สิ่งนี้อาจมาจากภาษา JVM FP ที่เกิดขึ้นใหม่เช่น Scala

โดยทั่วไปฟิลด์เป็นตัวแปรส่วนตัวในคลาสอินสแตนซ์ ไม่ได้หมายความว่ามีผู้ทะเยอทะยานและผู้ตั้งตน

แอตทริบิวต์เป็นคำที่คลุมเครือ สามารถสับสนกับ XML หรือ Java Naming API ได้อย่างง่ายดาย พยายามหลีกเลี่ยงการใช้คำนั้น

Propertyคือการรวมกันของ getter และ setter

ตัวอย่างด้านล่าง

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;
    }

}

มีชุดค่าผสมอื่น ๆ อีกมากมาย แต่มือของฉันเหนื่อย :)


3
@Chris Thompson นั้น Eclipse เรียกมันว่าอะไรในกล่องโต้ตอบของมัน เฮ้คนจาวาของมัน ฉันจะบอกอะไรคุณได้ มันไม่สมเหตุสมผล
Adam Gent

4
@AdamGent JAVA = ตัวย่อที่คลุมเครืออื่น ๆ :)
emory

@emory มันเป็น oxymoron ที่รู้จักกันดี นั่นไม่มีอะไรเฉพาะเจาะจงกับ Java เลยว่า "ปัญหา" ย้อนกลับไปจนถึงอย่างน้อย C และอาจนานกว่านี้แน่นอนว่าไม่มีอะไรหยุดคุณจากการเรียกมันว่า "คงที่"
Voo

@AdamGent ก็ไม่ร้ายแรงเพียงให้คุณมีเวลาที่ยาก ;-)
คริส ธ อมป์สัน

1
คำอธิบายที่ดีในขณะที่สร้างความสนุกว่าชื่อตัวระบุนั้นยาวได้นานเท่าไร
sargas

5

หากคำถามของคุณได้รับแจ้งโดยใช้ JAXB และต้องการเลือกที่ถูกต้องXMLAccessTypeฉันมีคำถามเดียวกัน JAXB Javadocกล่าวว่า "ฟิลด์" เป็นตัวแปรอินสแตนซ์ที่ไม่คงที่และไม่เป็นแบบชั่วคราว "คุณสมบัติ" มีคู่ getter / setter (ดังนั้นควรเป็นตัวแปรส่วนตัว) "สมาชิกสาธารณะ" เป็นสาธารณะและอาจเป็นค่าคงที่ นอกจากนี้ใน JAXB เป็น "แอตทริบิวต์" หมายถึงการเป็นส่วนหนึ่งขององค์ประกอบ XML <myElement myAttribute="first">hello world</myElement>ในขณะที่

ดูเหมือนว่า Java "คุณสมบัติ" โดยทั่วไปสามารถกำหนดเป็นฟิลด์ที่มีอย่างน้อย getter หรือวิธีสาธารณะอื่น ๆ ที่ช่วยให้คุณได้รับค่าของมัน บางคนก็บอกว่าทรัพย์สินจำเป็นต้องมีหมา สำหรับคำจำกัดความเช่นนี้บริบทคือทุกสิ่ง


5

ดิเอเทลกับดิเอเทลมีวิธีอธิบายฟิลด์และตัวแปรที่ดี

“ การรวมตัวแปรคงที่และตัวแปรอินสแตนซ์ของคลาสเข้าด้วยกันเป็นที่รู้จักกันในชื่อเขตข้อมูล” (มาตรา 6.3)

“ ตัวแปรควรได้รับการประกาศให้เป็นฟิลด์เฉพาะในกรณีที่จำเป็นต้องใช้ในคลาสมากกว่าหนึ่งวิธีหรือหากโปรแกรมควรบันทึกค่าระหว่างการเรียกไปยังเมธอดของคลาส” (มาตรา 6.4)

ดังนั้นฟิลด์ของคลาสคือตัวแปรแบบสแตติกหรืออินสแตนซ์ - เช่นประกาศด้วยขอบเขตคลาส

ข้อมูลอ้างอิง - Dietel P. , Dietel, H. - Java ™วิธีโปรแกรม (Early Objects), Tenth Edition (2014)


3

หากคุณรับเบาะแสจาก Hibernate:

ไฮเบอร์เนตอ่าน / เขียนสถานะของวัตถุด้วยฟิลด์ Hibernate ยังแมปคุณสมบัติสไตล์ Java Bean กับ DB Schema ไฮเบอร์เนตเข้าถึงฟิลด์สำหรับการโหลด / บันทึกวัตถุ หากการแม็พถูกทำโดยคุณสมบัติ hibernate จะใช้ getter และ setter

มันเป็น Encapsulation ที่สร้างความแตกต่างซึ่งหมายความว่าคุณมีทะเยอทะยาน / ผู้ตั้งค่าสำหรับเขตข้อมูลและมันถูกเรียกว่าคุณสมบัติด้วยสิ่งนั้นและเราซ่อนโครงสร้างข้อมูลพื้นฐานของคุณสมบัตินั้นภายใน setMethod เราสามารถป้องกันการเปลี่ยนแปลงที่ไม่พึงประสงค์ภายใน setters ทุกสิ่งที่ห่อหุ้มหมายถึง ...

ต้องประกาศฟิลด์และกำหนดค่าเริ่มต้นก่อนที่จะใช้ ส่วนใหญ่ใช้สำหรับการเรียนภายใน

คุณสมบัติสามารถเปลี่ยนแปลงได้โดย setter และถูกเปิดเผยโดย getters ที่นี่ราคาสนามมีทะเยอทะยาน / setters จึงเป็นทรัพย์สิน

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

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

ในทำนองเดียวกันการใช้เขตข้อมูล [ในจำศีลมันเป็นวิธีที่แนะนำให้ MAP ใช้เขตข้อมูลที่ int ส่วนตัว id; ถูกใส่คำอธิบายประกอบ @Id แต่ด้วยคุณสมบัติที่คุณสามารถควบคุมได้มากขึ้น]

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

Java doc พูดว่า: Field เป็นสมาชิกข้อมูลของคลาส ฟิลด์เป็นอินสแตนซ์ของตัวแปรที่ไม่คงที่และไม่ใช่แบบชั่วคราว โดยทั่วไปฟิลด์เป็นตัวแปรส่วนตัวในคลาสอินสแตนซ์


2

ตัวแปรประกอบด้วยฟิลด์และฟิลด์ที่ไม่ใช่

ฟิลด์สามารถเป็นได้ทั้ง:

  1. ฟิลด์คงที่หรือ
  2. ฟิลด์ที่ไม่คงที่หรือที่เรียกว่า instantiations เช่น x = F ()

ไม่ใช่ฟิลด์สามารถเป็นได้ทั้ง:

  1. ตัวแปรโลคัล, อะนาล็อกของฟิลด์ แต่ภายในเมธอดมากกว่าภายนอกทั้งหมด, หรือ
  2. พารามิเตอร์เช่น y ใน x = f (y)

โดยสรุปความแตกต่างที่สำคัญระหว่างตัวแปรคือไม่ว่าจะเป็นเขตข้อมูลหรือไม่ใช่เขตข้อมูลซึ่งหมายความว่าพวกเขาอยู่ในวิธีการหรือนอกวิธีการทั้งหมด

ตัวอย่างพื้นฐาน (ขอโทษสำหรับไวยากรณ์ของฉันฉันเป็นแค่มือใหม่)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}

1

จริงๆแล้วทั้งสองคำนี้มักจะใช้เพื่อแสดงสิ่งเดียวกัน แต่มีบางสถานการณ์ที่พิเศษ เขตข้อมูลสามารถเก็บสถานะของวัตถุ นอกจากนี้ฟิลด์ทั้งหมดเป็นตัวแปร ดังนั้นจึงเป็นที่ชัดเจนว่าอาจมีตัวแปรที่ไม่ใช่ฟิลด์ ดังนั้นเมื่อพิจารณาถึงตัวแปร 4 ประเภท (ตัวแปรคลาส, ตัวแปรอินสแตนซ์, ตัวแปรโลคัลและตัวแปรพารามิเตอร์) เราจะเห็นว่าตัวแปรคลาสและตัวแปรอินสแตนซ์สามารถส่งผลกระทบต่อสถานะของวัตถุ กล่าวอีกนัยหนึ่งถ้าตัวแปรคลาสหรืออินสแตนซ์เปลี่ยนแปลงสถานะของวัตถุจะเปลี่ยนไป ดังนั้นเราจึงสามารถพูดได้ว่าตัวแปรคลาสและตัวแปรอินสแตนซ์เป็นฟิลด์ในขณะที่ตัวแปรโลคอลและตัวแปรพารามิเตอร์ไม่ใช่

หากคุณต้องการเข้าใจอย่างลึกซึ้งยิ่งขึ้นคุณสามารถตรงไปที่แหล่งข้อมูลด้านล่าง: -

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


0

คำถามนั้นเก่า แต่ความแตกต่างที่สำคัญอีกอย่างหนึ่งระหว่างตัวแปรและเขตข้อมูลก็คือเขตข้อมูลจะได้รับค่าเริ่มต้นเมื่อมีการประกาศตัวแปรในทางกลับกันจะต้องเริ่มต้น


คุณสมบัติเป็นอย่างไร
Koray Tugay

0

ความเข้าใจของฉันเป็นด้านล่างและฉันไม่ได้บอกว่านี่ถูกต้อง 100% ฉันอาจเข้าใจผิดได้เช่นกัน ..

ตัวแปรคือสิ่งที่คุณประกาศซึ่งสามารถจากการเปลี่ยนแปลงค่าเริ่มต้นและมีค่าที่แตกต่างกัน แต่ที่ยังสามารถอย่างชัดเจนกล่าวว่าเป็นครั้งสุดท้าย ใน Java ที่จะ:

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();
    }
}

โดยทั่วไปแล้วตัวแปรคือสิ่งใดก็ตามที่ถูกประกาศและสามารถเก็บค่าได้ เมธอด foo ด้านบนส่งคืนตัวแปรตัวอย่างเช่นจะคืนค่าตัวแปรชนิด Integer ซึ่งเก็บที่อยู่หน่วยความจำของ Integer ใหม่ () ทุกอย่างที่คุณเห็นด้านบนยังเป็นตัวแปร listVariable, aFinalVariableExample และอธิบายที่นี่:

เขตข้อมูลเป็นตัวแปรที่ขอบเขตมีความชัดเจนมากขึ้น (หรือรูปธรรม) ตัวแปรที่ส่งคืนจากขอบเขตของเมธอด foo นั้นไม่ชัดเจนในตัวอย่างด้านบนดังนั้นฉันจะไม่เรียกมันว่าฟิลด์ ในทางกลับกัน iAmAlsoVariable เป็นฟิลด์ "ท้องถิ่น" ถูก จำกัด โดยขอบเขตของเมธอด foo และ listVariable เป็นฟิลด์ "อินสแตนซ์" ที่ขอบเขตของฟิลด์ (ตัวแปร) ถูก จำกัด โดยขอบเขตวัตถุ

สถานที่ให้บริการเป็นเขตข้อมูลที่สามารถเข้าถึง / กลายพันธุ์ ฟิลด์ใด ๆ ที่แสดงให้เห็นว่า getter / setter เป็นคุณสมบัติ

ฉันไม่รู้เกี่ยวกับคุณลักษณะและฉันอยากจะย้ำอีกครั้งว่านี่คือความเข้าใจของฉันเกี่ยวกับตัวแปรเขตข้อมูลและคุณสมบัติ


0
  • variable- ที่อยู่ที่จัดเก็บชื่อ ตัวแปรทุกตัวมีชนิดที่กำหนดขนาดหน่วยความจำคุณลักษณะและพฤติกรรม มีประเภทของตัวแปร Java: class variable, instance variable, local variable,method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field- ตัวแปรสมาชิกหรือข้อมูลสมาชิก มันคือvariableภายในclass( class variableหรือinstance variable)

  • attribute- ในบางบทความคุณจะพบว่าattributeมันเป็นตัวแทนของobject ดำเนินการโดยที่กำหนดชุดของลักษณะclass variableObjectattributes

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+ getter/setterจำกัด มันมีไวยากรณ์ฟิลด์ แต่ใช้วิธีการภายใต้ประทุน Javaไม่สนับสนุนในรูปแบบบริสุทธิ์ ลองดูที่Objective-C, Swift,Kotlin

ตัวอย่างKotlinตัวอย่าง:

//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

[คุณสมบัติของ Swift variable]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.