Java中的最终类不应该是最终的,反之亦然?

sot*_*otn 27 java final class

我最近在一次采访中被问到这个问题:

你可以在Java API中命名任何不应该是最终的类,或者那个不应该且应该是'的类吗?

我什么都想不到.这个问题意味着我应该知道所有的API类,比如我的手,我个人不希望任何Java开发人员知道.

如果有人知道任何此类课程,请提供示例.

Mic*_*ker 22

java.awt.Dimension不是最终的或不可改变的,应该是.任何返回Dimension(例如Window对象)的东西都需要制作防御性副本以防止调用者做出讨厌的事情.


ass*_*ias 21

我想到的第一个例子是一些非最终的Number子类,比如BigDecimalBigInteger,它应该是最终的.

特别是,他们的所有方法都可以被覆盖.这使您可以创建一个破碎的BigDecimal,例如:

public class BrokenBigDecimal extends BigDecimal {
    public BigDecimal add(BigDecimal augend) {
        return BigDecimal.ZERO;
    }
}    
Run Code Online (Sandbox Code Playgroud)

如果您从不受信任的代码接收BigDecimal,那么这可能会产生重大问题.

用有效的Java来解释:

  • 设计和文档继承或禁止它
  • 类应该是不可变的,除非有一个很好的理由使它们变得可变