如前所述,final
它与Java方法一起使用以标记该方法不能被覆盖(对于对象范围)或隐藏(对于静态)。这使原始开发人员可以创建子类无法更改的功能,这就是它提供的所有保证。
这意味着,如果该方法依赖于其他可自定义的组件(例如非公共字段/方法),则最终方法的功能仍可以自定义。这样做很好,因为(具有多态性)它允许部分定制。
阻止某些内容可自定义的原因有很多,其中包括:
性能 -一些编译器可以分析和优化操作,尤其是没有副作用的编译器。
获取封装的数据 -查看不可变对象,这些对象的属性在构造时设置,并且永远不要更改。或从这些属性派生的计算值。Java String
类就是一个很好的例子。
可靠性和合同 -对象是由基元(的int
,char
,double
等等)和/或其它对象。当在较大的Object中使用这些操作时,并非所有适用于那些组件的操作都应该适用甚至是逻辑上的。带有final
修饰符的方法可以用来确保这一点。Counter类是一个很好的例子。
public class Counter {
private int counter = 0;
public final int count() {
return counter++;
}
public final int reset() {
return (counter = 0);
}
}
如果public final int count()
方法不是final
,我们可以这样做:
Counter c = new Counter() {
public int count() {
super.count();
return super.count();
}
}
c.count(); // now count 2
或类似这样的东西:
Counter c = new Counter() {
public int count() {
int lastCount = 0;
for (int i = super.count(); --i >= 0; ) {
lastCount = super.count();
}
return lastCount;
}
}
c.count(); // Now double count