【问题标题】:final object in java [duplicate]java中的最终对象[重复]
【发布时间】:2010-07-17 11:28:20
【问题描述】:

可能重复:
When to use final

为对象声明 final 关键字有什么用?例如:

final Object obj = new myclass();

【问题讨论】:

标签: java


【解决方案1】:

使用“final”关键字使您声明的变量不可变。一旦最初分配,就不能重新分配。

但是,这并不一定意味着被变量引用的实例的状态是不可变的,只有引用本身是不可变的。

在变量上使用“final”关键字有几个原因。一种是优化,通过将变量声明为 final 允许值为memoized

使用 final 变量的另一种情况是方法中的内部类需要访问声明方法中的变量。以下代码说明了这一点:

public void foo() {

        final int x = 1;

        new Runnable() {


            @Override
            public void run() {
                int i = x;
            }

        };

}

如果 x 未声明为“final”,则代码将导致编译错误。需要“最终”的确切原因是因为新类实例可以比方法调用更长寿,因此需要它自己的 x 实例。为了避免一个可变变量在同一个作用域内有多个副本,该变量必须声明为final,这样它就不能被改变。

一些程序员还提倡使用“final”来防止意外地将变量重新分配到不应该出现的位置。有点像“最佳实践”类型的规则。

【讨论】:

    【解决方案2】:

    final 防止意外更改的另一种用法:

    public String foo(int a) {
      final String s;
      switch(a) {
      case 0:
        s="zero";
        break;
      case 1:
        s="one";
        //forgot break;
      default:
        s="some number";
      }
      return s;
    }
    

    这不会编译,因为如果 a==1,s 将被分配两次,因为缺少中断。 Final 可以帮助处理讨厌的 switch 语句。

    【讨论】:

      【解决方案3】:

      最终变量不能重新分配。如果它们是类或实例范围的,则必须在构造对象时分配它们。一种用途:您不希望其他人使用您更改的常量,例如string 或 int 常量(尽管枚举在 1.5+ 中做得更好)。此外,如果您想从您在该方法中定义的匿名方法引用方法范围变量,它必须是最终的,因此 Java 不必处理如果您的代码稍后重新分配该变量会发生什么,在它创建之后内部匿名方法的本地堆栈框架/范围。有人谈到在 Java 7 中包含某种形式的闭包可能会避免这种限制。

      我的术语可能有点搞砸了——抱歉!但这是一般的想法。

      【讨论】:

        【解决方案4】:

        它声明了一个一旦初始化就不能修改的变量。有点只读。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-20
          • 1970-01-01
          • 2011-11-25
          • 2019-04-14
          • 2020-04-23
          • 2023-01-25
          • 1970-01-01
          相关资源
          最近更新 更多