java中的最终对象

Man*_*anu 7 java

可能重复:
何时使用final

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

final Object obj = new myclass();
Run Code Online (Sandbox Code Playgroud)

S73*_*17H 23

使用"final"关键字会使您声明为不可变的变量.初始分配后,无法重新分配.

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

有几个原因可以在变量上使用"final"关键字.一种是优化,其中通过将变量声明为final来允许值被记忆.

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

public void foo() {

        final int x = 1;

        new Runnable() {


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

        };

}
Run Code Online (Sandbox Code Playgroud)

如果x未声明为"final",则代码将导致编译错误.需要成为"最终"的确切原因是因为新的类实例可以比方法调用更长,因此需要它自己的x实例.为了避免在同一范围内拥有多个可变变量副本,必须将变量声明为final,以便不能更改.

一些程序员还提倡使用"final"来防止意外重新分配变量.排序"最佳实践"类型规则.


Ish*_*tar 7

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

这将无法编译,因为如果a == 1,s将被分配两次,因为缺少中断.最终可以帮助讨厌的转换语句.


Alt*_*ape 6

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

我可能会对术语有点拙劣 - 抱歉!但那是一般的想法.