เมื่ออ้างถึงตัวแปรส่วนตัวภายในของ Java POJO ที่มี getters / setters ฉันใช้เงื่อนไขต่อไปนี้:
- สนาม
- ตัวแปร
- คุณลักษณะ
- คุณสมบัติ
มีความแตกต่างระหว่างข้างต้นหรือไม่? ถ้าใช่คำที่ถูกต้องคืออะไร มีคำอื่นที่จะใช้เมื่อมีการยืนยันเอนทิตีนี้หรือไม่?
เมื่ออ้างถึงตัวแปรส่วนตัวภายในของ Java POJO ที่มี getters / setters ฉันใช้เงื่อนไขต่อไปนี้:
มีความแตกต่างระหว่างข้างต้นหรือไม่? ถ้าใช่คำที่ถูกต้องคืออะไร มีคำอื่นที่จะใช้เมื่อมีการยืนยันเอนทิตีนี้หรือไม่?
คำตอบ:
จากที่นี่: http://docs.oracle.com/javase/tutorial/information/glossary.html
สนาม
คุณสมบัติ
คุณลักษณะ
ตัวแปร
ใช่แล้ว
ตัวแปรอาจเป็นแบบโลคอลฟิลด์หรือค่าคงที่ (แม้ว่านี่จะผิดในทางเทคนิค) มันคลุมเครือเช่นแอตทริบิวต์ นอกจากนี้คุณควรรู้ว่าบางคนชอบที่จะเรียกตัวแปรสุดท้ายที่ไม่คงที่ (ท้องถิ่นหรือตัวอย่าง)
" ค่า " สิ่งนี้อาจมาจากภาษา 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;
}
}
มีชุดค่าผสมอื่น ๆ อีกมากมาย แต่มือของฉันเหนื่อย :)
หากคำถามของคุณได้รับแจ้งโดยใช้ JAXB และต้องการเลือกที่ถูกต้องXMLAccessType
ฉันมีคำถามเดียวกัน JAXB Javadocกล่าวว่า "ฟิลด์" เป็นตัวแปรอินสแตนซ์ที่ไม่คงที่และไม่เป็นแบบชั่วคราว "คุณสมบัติ" มีคู่ getter / setter (ดังนั้นควรเป็นตัวแปรส่วนตัว) "สมาชิกสาธารณะ" เป็นสาธารณะและอาจเป็นค่าคงที่ นอกจากนี้ใน JAXB เป็น "แอตทริบิวต์" หมายถึงการเป็นส่วนหนึ่งขององค์ประกอบ XML <myElement myAttribute="first">hello world</myElement>
ในขณะที่
ดูเหมือนว่า Java "คุณสมบัติ" โดยทั่วไปสามารถกำหนดเป็นฟิลด์ที่มีอย่างน้อย getter หรือวิธีสาธารณะอื่น ๆ ที่ช่วยให้คุณได้รับค่าของมัน บางคนก็บอกว่าทรัพย์สินจำเป็นต้องมีหมา สำหรับคำจำกัดความเช่นนี้บริบทคือทุกสิ่ง
ดิเอเทลกับดิเอเทลมีวิธีอธิบายฟิลด์และตัวแปรที่ดี
“ การรวมตัวแปรคงที่และตัวแปรอินสแตนซ์ของคลาสเข้าด้วยกันเป็นที่รู้จักกันในชื่อเขตข้อมูล” (มาตรา 6.3)
“ ตัวแปรควรได้รับการประกาศให้เป็นฟิลด์เฉพาะในกรณีที่จำเป็นต้องใช้ในคลาสมากกว่าหนึ่งวิธีหรือหากโปรแกรมควรบันทึกค่าระหว่างการเรียกไปยังเมธอดของคลาส” (มาตรา 6.4)
ดังนั้นฟิลด์ของคลาสคือตัวแปรแบบสแตติกหรืออินสแตนซ์ - เช่นประกาศด้วยขอบเขตคลาส
ข้อมูลอ้างอิง - Dietel P. , Dietel, H. - Java ™วิธีโปรแกรม (Early Objects), Tenth Edition (2014)
หากคุณรับเบาะแสจาก 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 เป็นสมาชิกข้อมูลของคลาส ฟิลด์เป็นอินสแตนซ์ของตัวแปรที่ไม่คงที่และไม่ใช่แบบชั่วคราว โดยทั่วไปฟิลด์เป็นตัวแปรส่วนตัวในคลาสอินสแตนซ์
ตัวแปรประกอบด้วยฟิลด์และฟิลด์ที่ไม่ใช่
ฟิลด์สามารถเป็นได้ทั้ง:
ไม่ใช่ฟิลด์สามารถเป็นได้ทั้ง:
โดยสรุปความแตกต่างที่สำคัญระหว่างตัวแปรคือไม่ว่าจะเป็นเขตข้อมูลหรือไม่ใช่เขตข้อมูลซึ่งหมายความว่าพวกเขาอยู่ในวิธีการหรือนอกวิธีการทั้งหมด
ตัวอย่างพื้นฐาน (ขอโทษสำหรับไวยากรณ์ของฉันฉันเป็นแค่มือใหม่)
Class {
//fields
method1 {
//non-fields
}
}
จริงๆแล้วทั้งสองคำนี้มักจะใช้เพื่อแสดงสิ่งเดียวกัน แต่มีบางสถานการณ์ที่พิเศษ เขตข้อมูลสามารถเก็บสถานะของวัตถุ นอกจากนี้ฟิลด์ทั้งหมดเป็นตัวแปร ดังนั้นจึงเป็นที่ชัดเจนว่าอาจมีตัวแปรที่ไม่ใช่ฟิลด์ ดังนั้นเมื่อพิจารณาถึงตัวแปร 4 ประเภท (ตัวแปรคลาส, ตัวแปรอินสแตนซ์, ตัวแปรโลคัลและตัวแปรพารามิเตอร์) เราจะเห็นว่าตัวแปรคลาสและตัวแปรอินสแตนซ์สามารถส่งผลกระทบต่อสถานะของวัตถุ กล่าวอีกนัยหนึ่งถ้าตัวแปรคลาสหรืออินสแตนซ์เปลี่ยนแปลงสถานะของวัตถุจะเปลี่ยนไป ดังนั้นเราจึงสามารถพูดได้ว่าตัวแปรคลาสและตัวแปรอินสแตนซ์เป็นฟิลด์ในขณะที่ตัวแปรโลคอลและตัวแปรพารามิเตอร์ไม่ใช่
หากคุณต้องการเข้าใจอย่างลึกซึ้งยิ่งขึ้นคุณสามารถตรงไปที่แหล่งข้อมูลด้านล่าง: -
คำถามนั้นเก่า แต่ความแตกต่างที่สำคัญอีกอย่างหนึ่งระหว่างตัวแปรและเขตข้อมูลก็คือเขตข้อมูลจะได้รับค่าเริ่มต้นเมื่อมีการประกาศตัวแปรในทางกลับกันจะต้องเริ่มต้น
ความเข้าใจของฉันเป็นด้านล่างและฉันไม่ได้บอกว่านี่ถูกต้อง 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 เป็นคุณสมบัติ
ฉันไม่รู้เกี่ยวกับคุณลักษณะและฉันอยากจะย้ำอีกครั้งว่านี่คือความเข้าใจของฉันเกี่ยวกับตัวแปรเขตข้อมูลและคุณสมบัติ
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 variable
Object
attributes
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