当提到具有 getter/setter 的 Java POJO 的内部私有变量时,我使用了以下术语:
- 场地
- 多变的
- 属性
- 财产
以上有什么区别吗?如果是这样,正确使用的术语是什么?当这个实体被持久化时,是否有不同的术语可以使用?
从这里:http ://docs.oracle.com/javase/tutorial/information/glossary.html
场地
财产
属性
多变的
就在这里。
变量可以是局部的、字段的或常量(尽管这在技术上是错误的)。它像属性一样模糊。另外,你应该知道有些人喜欢调用final非静态(本地或实例)变量
“价值观”。这可能来自新兴的 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 或其他一些允许您获取其值的公共方法的字段。也有人说一个属性需要有一个setter。对于这样的定义,上下文就是一切。
Dietel 和 Dietel 有一种很好的方式来解释字段与变量。
“一个类的静态变量和实例变量一起被称为它的字段。” (第 6.3 节)
“仅当需要在类的多个方法中使用变量或程序应在调用类方法之间保存其值时,才应将变量声明为字段。” (第 6.4 节)
所以一个类的字段是它的静态或实例变量——即用类范围声明。
参考 - Dietel P., Dietel, H. - Java™ How To Program (Early Objects),第十版 (2014)
如果您从 Hibernate 中获取线索:
Hibernate 使用其字段读取/写入对象的状态。Hibernate 还将 Java Bean 样式属性映射到 DB Schema。休眠访问用于加载/保存对象的字段。如果映射是通过属性完成的,hibernate 使用 getter 和 setter。
封装区分意味着你在哪里有一个字段的getter/setter,它被称为属性,我们在setMethod中隐藏了该属性的底层数据结构,我们可以防止在setter中进行不必要的更改。封装所代表的一切...
字段必须在使用前声明和初始化。主要用于课堂内部使用。
属性可以由 setter 更改,并且由 getter 公开。这里的字段价格有getter/setter,所以它是财产。
class Car{
private double price;
public double getPrice() {…};
private void setPrice(double newPrice) {…};
}
<class name="Car" …>
<property name="price" column="PRICE"/>
</class>
类似地使用fields,[在休眠中,推荐使用 fields 进行 MAP 的方式,其中 private int id; 被注释为@Id,但使用属性你有更多的控制]
class Car{
private double price;
}
<class name="Car">
<property name=" price" column="PRICE" access="field"/>
</class>
Java doc 说:字段是类的数据成员。字段是非静态的、非瞬态的实例变量。字段通常是实例类上的私有变量。
Java中变量、字段、属性、属性的区别:
变量是赋予内存位置的名称。它是程序中存储的基本单位。
字段是类的数据成员。除非另有说明,否则字段可以是公共的、静态的、非静态的和最终的。
属性是字段的另一个术语。它通常是一个可以直接访问的公共字段。
属性是用于字段的术语,但它通常具有 getter 和 setter 组合。
变量由字段和非字段组成。
字段可以是:
非字段可以是:
总之,变量之间的关键区别在于它们是字段还是非字段,这意味着它们是在方法内部还是在所有方法之外。
基本示例(对不起我的语法,我只是一个初学者)
Class {
//fields
method1 {
//non-fields
}
}
Java 变量、字段、属性
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.myAttribute = "poor fantasy"; //`myAttribute` 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
实际上,这两个术语通常用于表示同一事物,但也有一些例外情况。字段可以存储对象的状态。此外,所有字段都是变量。所以很明显,可以有不是字段的变量。因此,查看 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 的字段都是属性。
我不知道属性,我还想重申一下,这是我对变量、字段和属性的理解。