正确使用final

时间:2013-02-01 17:50:55

标签: java final

  

可能重复:
  Java final modifier

这只是一个关于偏好的小问题。最终修饰符的正确用法是什么?

我注意到,从源到源,我倾向于使用它比其他人更多。我把它作为方法的参数,方法中的变量和我能做的。这是必要的还是我只是过度了?

参考:

private final int x;
private final int y;
private final int id;
private final int width;
private final int height;

public Widget(final int id, final int x, final int y, final int width, final int height) {
    this.id = id;
    this.x = x;
    this.y = y;
    this.xmod = x;
    this.ymod = y;
    this.width = width;
    this.height = height;
}

5 个答案:

答案 0 :(得分:5)

是的,你过度了。从历史上看,这可能会导致一些优化 - 例如最终方法可以更容易地内联 - 但是现在,无论你是否真的将方法标记为最终,大多数优化都会完成。

你应该仍然使用final的地方是在类中的大多数字段,不应该或不是扩展的类上,不希望被覆盖的方法,以及需要引用的局部变量在匿名内部类。

特别是,在局部变量和方法参数上执行它是不合适的,这些参数不会包含在匿名内部类中。

答案 1 :(得分:2)

我想说永远不会改变或覆盖的任何领域,类或方法都应该是最终的。这使得它是线程安全的,并允许编译器和vm进行优化。它还阐明了您作为程序员的意图,并告诉其他开发人员,如果他们正在寻找可以在其他地方寻找的复杂性,那么价值永远不会改变。

这里的好文章: http://www.javapractices.com/topic/TopicAction.do?Id=23

答案 2 :(得分:1)

我想说,只要你不想在初始化之后改变一个变量,或者你不希望一个类被子类化或者一个方法被覆盖而是子类,你应该使用“final”。关于编译器优化,我认为使用“final”关键字会有所帮助,但我只是读到了这个:

  

一个常见的误解是声明一个类或方法最终   通过允许编译器直接插入来提高效率   方法在任何地方都可以内联。实际上编译器无法做到   这样做是因为该方法在运行时加载,可能不是   与刚刚编译的版本相同的版本。只有运行时   环境和JIT编译器有关于哪些信息   类已被加载,并能够做出更好的决策   什么时候内联,方法是否是最终的。

http://en.wikipedia.org/wiki/Final_(Java)

答案 3 :(得分:1)

如果今天设计了Java,默认情况下所有局部变量和方法参数都是最终的。

不幸的是,由于语言没有这样做,我们应该手动吗?

这似乎太过分了。如果我们不这样做,并且似乎没有一个巨大的问题,那么我们就可以懒惰而不去做。

答案 4 :(得分:0)

没有必要每次都使变量最终。当您想要更改此类变量的值时,可能会变得很头疼。

我认为,只有当变量是单不变的时,或者当你认为它不应该被改变时,你才应该对变量final进行decalre。