6

可能重复:
Java final 修饰符

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

我注意到,从源到源,我比其他人更倾向于使用它。我将它用于方法的参数,方法中的变量以及我可以做的任何事情。这是必要的还是我做得过火了?

参考:

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;
}
4

5 回答 5

5

是的,你做得太过分了。从历史上看,这可能会导致一些优化——例如,final 方法可以更容易地内联——但是现在,无论您是否实际将方法标记为 final,大部分优化都已完成。

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

特别是,在不会被匿名内部类包装的局部变量和方法参数上这样做是过分的。

于 2013-02-01T17:57:36.077 回答
2

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

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

于 2013-02-01T17:53:58.627 回答
1

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

一个常见的误解是,声明一个类或方法 final 通过允许编译器直接将方法插入到任何被调用的地方来提高效率。事实上,编译器无法做到这一点,因为该方法是在运行时加载的,并且可能与刚刚编译的版本不同。只有运行时环境和 JIT 编译器才能准确了解加载了哪些类,并且能够更好地决定何时内联,无论方法是否是最终的。

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

于 2013-02-01T17:56:47.887 回答
1

如果今天设计 Java,所有局部变量和方法参数默认都是 final 的。

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

只是看起来太繁琐了。如果我们不这样做,而且似乎没有什么大问题,那么我们可以偷懒不做。

于 2013-02-01T18:45:26.770 回答
0

不必每次都将变量设为最终变量。当你想改变这些变量的值时,它可能会变得很头疼。

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

于 2013-02-01T18:39:42.380 回答