最终实例变量的意义是什么?

Ank*_*kit 5 java static constants instance-variables class-variables

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:-

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
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果最终实例变量不能为每个不同的实例提供不同的值,那么它有什么意义呢?我的意思是如果它们对于每个实例具有相同的值,那么为什么我们不将它们声明为类变量(静态最终类变量),因为这将起到相同的作用,并且我们不需要创建对象来访问它们.


编辑-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);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:-

Foof.java:8: cannot assign a value to final variable size
size = 23;
^
1 error
Run Code Online (Sandbox Code Playgroud)

根据错误,我可以看出在创建对象期间第一个大小被赋值= 3.

Jon*_*eet 12

所以我的问题是,如果最终实例变量不能为每个不同的实例提供不同的值,那么它有什么意义呢?

它们可以,但这些值在创建后无法更改.您只能将值分配给实例变量初始值设定项和构造函数中的最终实例字段,并且必须将值分配给所有实例字段.

请注意,在您的代码中:

Foof()
{
    whuffie=42;  //compile time error
}
Run Code Online (Sandbox Code Playgroud)

......评论不正确.这项任务应该是完全有效的.

最终字段对于实现不变性非常有用- 这有助于简化对象的推理.例如,String是不可变的,因此如果您验证字符串然后保留引用的副本,您就会知道稍后验证仍然是正确的.

与之相比java.util.Date,如果您真的希望对验证有用,那么您需要创建Date值的防御性副本,而不是提供对任何其他代码的引用,以防它更改所表示的基础瞬间.

  • @Ankit:然后你需要删除初始化表达式.基本上,你只能设置一个*的最终变量*. (3认同)