我在 static final class variable
和 final instance variable
之间有些混淆。
这是示例代码:-
class Foof{
final int size=3;
final int whuffie;
Foof()
{
whuffie=42;
}
public static void main(String [] args){
Foof obj1 = new Foof();
Foof obj2 = new Foof();
obj1.size=53; //compile time error
System.out.println(obj1.size);
obj2.whuffie=45; //compile time error
System.out.println(obj2.whuffie);
}
}
错误:-
ankit@stream:/home/Data/JAVA/practice/src/test.com/test-20121031_static_demystified$ javac Foof.java
Foof.java:14: error: cannot assign a value to final variable size
obj1.size=53; //compile time error
^
Foof.java:16: error: cannot assign a value to final variable whuffie
obj2.whuffie=45;
^
2 errors
所以我的问题是,如果每个不同的实例不能有不同的值,那么拥有 final 实例变量的意义何在?我的意思是,如果它们对每个实例都具有相同的值,那么为什么我们不将它们声明为类变量(静态最终类变量),因为这将起到相同的作用,而且我们不需要创建对象来访问它们。
编辑-1:-
class Foof{
final int size=3;
final int whuffie;
Foof()
{
whuffie=42;
size = 23; //compile-time error.
}
public static void main(String [] args){
Foof obj1 = new Foof();
Foof obj2 = new Foof();
//obj1.size=53;
System.out.println(obj1.size);
//obj2.whuffie=45;
System.out.println(obj2.whuffie);
}
}
错误:-
Foof.java:8: cannot assign a value to final variable size
size = 23;
^
1 error
根据错误,我可以看出在对象创建期间第一个大小被分配了一个值=3。
最佳答案
So my question is, what is the point of having final instance variables if they can't have a different values per different instance.
它们可以,但这些值创建后不能更改。您只能为实例变量初始值设定项和构造函数中的最终实例字段赋值,并且您必须以这种方式为所有实例字段赋值。
请注意,在您的代码中:
Foof()
{
whuffie=42; //compile time error
}
...评论不正确。该分配应该是完全有效的。
Final 字段对于实现不变性 很有用 - 这有助于轻松推理对象。例如,String
是不可变的,因此如果您验证一个字符串然后保留引用的副本,您就知道以后验证仍然是正确的。
将其与 java.util.Date
进行比较,如果您真的希望验证有用,您需要创建 Date
的防御性副本。值并且不提供对任何其他代码的引用,以防它更改所表示的基础瞬间。
关于java - 最终实例变量的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13157528/