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

标签 java static constants instance-variables class-variables

我在 static final class variablefinal 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/

相关文章:

c++ - C++ 类成员函数的“静态”?

java - JMenuBar SelectionModel ChangeListener 仅触发一次

java - grails 中面向方面的编程问题。切入点方法未执行

c - ‘DisplayMenu’ 的静态声明遵循非静态声明

java - 为什么这不能是静态的?

iOS - 本地化静态常量

java - Java中是否有任何API可以访问维基百科数据

java - 使用 Eclipse 的 Android 项目给出错误 : Cannot switch on a value of type String for source level below 1. 7

c++ - "std::string const &s"和 "const std::string &s"有什么区别?

c++ - 如何指定方法更改了哪些数据成员?