当引用具有getter / setter的Java POJO的内部私有变量时,我使用了以下术语:
- 领域
- 变量
- 属性
- 属性
两者之间有什么区别吗?如果是这样,正确使用的术语是什么?保留该实体时是否有其他术语使用?
当引用具有getter / setter的Java POJO的内部私有变量时,我使用了以下术语:
两者之间有什么区别吗?如果是这样,正确使用的术语是什么?保留该实体时是否有其他术语使用?
Answers:
从这里:http : //docs.oracle.com/javase/tutorial/information/glossary.html
领域
属性
属性
变量
就在这里。
变量可以是局部变量,字段变量或常量变量(尽管从技术上讲这是错误的)。像属性一样模糊。此外,您应该知道有些人喜欢调用最终的非静态(局部或实例)变量
“ 价值观 ”。这可能来自新兴的JVM FP语言,例如Scala。
字段通常是实例类上的私有变量。这并不意味着有一个getter和setter。
属性是一个模糊的术语。它很容易与XML或Java Naming API混淆。尽量避免使用该术语。
属性是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或其他一些允许您获取其值的公共方法的字段。有人还说,财产需要有塞特犬。对于这样的定义,上下文就是一切。
如果您从Hibernate获得线索:
Hibernate使用其字段读取/写入对象的状态。Hibernate还将Java Bean样式属性映射到DB Schema。休眠访问用于加载/保存对象的字段。如果映射是通过属性完成的,则hibernate将使用getter和setter。
区别就是封装,这意味着您在一个字段中有一个getter / setter,它被称为property,并以此将其隐藏在setMethod中的该属性的底层数据结构中,从而可以防止setter内部发生不必要的更改。封装代表的一切...
必须先声明和初始化字段,然后才能使用它们。主要供班级内部使用。
可以通过setter更改属性,并通过getter公开它们。在此,实地价格具有获取/设定者的属性,因此它是属性。
class Car{
private double price;
public double getPrice() {…};
private void setPrice(double newPrice) {…};
}
<class name="Car" …>
<property name="price" column="PRICE"/>
</class>
类似地,使用fields [在休眠状态,这是使用MAP的推荐方法,其中private int id; 带有@Id注释,但是通过Property,您可以控制更多]
class Car{
private double price;
}
<class name="Car">
<property name=" price" column="PRICE" access="field"/>
</class>
Java doc说:Field是类的数据成员。字段是非静态,非瞬态实例变量。字段通常是实例类上的私有变量。
实际上,这两个术语通常用于表示同一件事,但是有一些例外情况。字段可以存储对象的状态。同样,所有字段都是变量。因此很明显,可以存在不是字段的变量。因此,查看四种类型的变量(类变量,实例变量,局部变量和参数变量),我们可以看到类变量和实例变量会影响对象的状态。换句话说,如果类或实例变量更改,则对象的状态也会更改。因此,可以说类变量和实例变量是字段,而局部变量和参数变量不是字段。
如果您想更深入地了解,可以转到以下资源:
我的理解如下,我并不是说这是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