【问题标题】:Should a private final field be static too?私有最终字段也应该是静态的吗?
【发布时间】:2014-06-01 17:18:27
【问题描述】:

我想知道,如果我的班级中有这个字段:private final int foo = ...,我应该把它放在静态private static final int foo = ... 中吗?因为如果它是静态的,那么它对我的类的所有实例都是通用的,并且永远不会改变。

有理由不把它放在静态中吗?还是我必须把它放在静态?

【问题讨论】:

  • final 确实 not 意味着它对类的所有实例都是通用的。 static 就是这个意思。
  • 不,如果是final,它仍然仅限于一个实例。 static 使其共享。
  • 我已经编辑过了,谢谢
  • 取决于您的要求。如果您希望在所有对象中使用此值而不进行任何更改,即 10 而不是使其成为静态,如果您将为每个对象设置不同的值但在定义一次后无法更改,您可以通过初始化来做到这一点它在构造函数中。

标签: java static


【解决方案1】:

如果你的类的每个实例都应该有 same 不可变的 foo 值,那么你应该使 foo 成为最终的和静态的。如果你的类的每个实例都可以有一个不同的(但仍然是不可变的)foo 值,那么这个值应该是最终的。

但是,如果您的类的每个实例都应该具有相同的 foo 不可变值,那么它实际上是一个常量。按照惯例,通常编码如下:

private static final int FOO = ...

注意大写字母表示常数...

【讨论】:

    【解决方案2】:

    如果你在constructor 中初始化它的值,那么它不应该是static 之类的

    private final int foo;
    
    public MyClass(int m){
        foo=m;
    }
    

    因为它的价值取决于入口价值。


    但是如果你像这样启动它的内联值

    private final int foo = 100;
    

    那么它的首选是static,因为它只有一个实例,因为final 字段将在类的每个实例上创建;但static 将被创建一次。

    【讨论】:

      【解决方案3】:

      构造函数仍然可以设置最终成员:因此,如果您的类的每个实例都可以在构造函数中设置 foo 并且该值应该只属于该实例,那么它应该只是最终的,而不是静态的。

      但是,如果 foo 仅在声明时设置,这可能意味着这是所有实例的通用值,并且您也可以通过将其声明为静态来赢得一点内存。请注意,如果 foo 不是原始成员而是引用成员,则 final 仅表示引用不能更改,而不是对象的内容,因此作为引用的 final 和非静态成员不应自动为静态。您可能希望类的每个实例都有一个不可变引用,具有不同的对象状态。

      【讨论】:

        【解决方案4】:

        它是一个常量,你不希望类的每个实例都有一个变量的副本,所以让它成为静态的。此外,如果您想从静态方法中使用它们,请将其设为静态。

        静态变量是类的所有实例共有的变量。如果一个实例改变了它,那么静态变量的值将为所有其他实例更新。

        如果您不希望这种行为,请保持非静态。

        【讨论】:

          【解决方案5】:

          这两个非访问修饰符有很大的不同。

          • final 表示您的变量可以被赋值一次。
          • static 将其范围设置为属于类(而不是实例或本地上下文)。

          除非设计使然,否则没有理由将它们放在一起。

          static final 变量事实上是一个常量

          例如,interfaces 中声明的字段隐式为publicstaticfinal

          final 的使用示例中,您可以找到非static 字段:

          • 在匿名类外部声明并在其中引用的字段
          • 在本地类中引用的本地字段(在方法体中声明)(在同一方法体中声明)
          • 等等……

          【讨论】:

            猜你喜欢
            • 2012-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-11
            • 2016-05-07
            • 2011-03-04
            • 2014-10-13
            • 2012-04-20
            相关资源
            最近更新 更多