我在这里的维基百科中读到:
最终类不能被子类化。这样做是出于安全和效率的原因。
我想知道final
Java 可以实现的那种安全性?
如果您的课程是最终课程,则没有人可以对其进行子类化。如果没有人可以继承你的 final 类,这意味着你的 final 类的特性不能被其他人通过重用你的类来改变。
假设您是技术提供商,在这里您为某个银行系统提供 API,使用您的 API 客户端将实现其银行系统。
案例:没有最终
这在您的 API 中
class BaseClass{
public void makeTransaction(){
}
}
这是客户端代码
class DerivedClass extends BaseClass{
public void makeTransaction(){
// naughty client can do something here like:- makeTransaction but transfer 1 dollar for each transaction to my account.
}
}
案例: WITH FINAL 这是在您的 API 中
final class BaseClass{
public void makeTransaction(){
}
}
这是客户端代码
class DerivedClass extends BaseClass{ // not allowed
}
客户必须使用您已经定义的 make transaction。这是 final 如何保护您的代码的一个方面。
最终类不能被子类化。这样做是出于安全性和效率的原因。我想知道 Java 中的 final 可以实现哪种安全性?
如果一个类不能被子类化,那么您就不能覆盖父类在子类中提供的功能。从设计的角度来看,您实际上是在使用 final 类来完成和执行设计。因此,从这个意义上说,它使您的最后一堂课得到保障。
final
不提供任何安全保障。期望它是愚蠢的。它提供了一种安全性。
尽管您的问题与 java 有关,但我将向您指出 Marshall Cline 的 C++ FAQ,它回答了类似的问题。
http://www.parashift.com/c++-faq/encap-is-not-security.html
[7.8] 封装是一种安全设备吗?
不。
封装!=安全。
封装可以防止错误,而不是间谍活动。
让我补充一点,诸如public
,private
等关键字final
并不能防止故意滥用。它们只是通过防止意外或无意误用来帮助实施设计的结构。
想要替换基类中的功能的程序员可以使用其他方法来做到这一点 - 最简单的是根本不使用该类并做他自己的事情。
如果您想阻止访问或任何其他事情,请在底层操作系统中进行,而不是在您的类库中。
与往常一样,维基百科可能是一个很好的起点,但很少是权威来源。
如果一个类 if final 比没有其他类继承该类和
无法覆盖方法
. 例如,String 类是 final 的,因此没有人可以覆盖和更改 String 类的方法。
假设您在银行工作,而您的老板要求一种方法来验证某些客户凭据。
你会有类似的东西:
public class Validation {
private Customer customer;
public Validation(Customer customer) {
this.customer = customer;
}
public boolean validate() {
return customer.isValid();
}
}
您必须在类或方法 validate 上加上 final(不知道为什么没有人提到它)。这样,如果有人想扩展你的类,他不会改变验证算法(final on method),他根本不会扩展类(final on class)。