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

2022-09-01 15:38:03

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

你能说出Java API中任何不应该是最终的类,或者一个不是而且应该是的类吗?

我想不出任何东西。这个问题意味着我应该知道所有的API类,就像我的手背一样,我个人不希望任何Java开发人员知道。

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


答案 1

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


答案 2

首先想到的例子是一些非最终的数字子类,例如BigDecimalBigInteger,它们应该是最终的。

特别是,可以重写它们的所有方法。这使您能够创建一个 broken ,例如:BigDecimal

public class BrokenBigDecimal extends BigDecimal {
    public BigDecimal add(BigDecimal augend) {
        return BigDecimal.ZERO;
    }
}    

例如,如果您从不受信任的代码接收BigDecimal,则可能会产生重大问题。

解释一下 Effective Java:

  • 用于继承的设计和文档,否则禁止继承
  • 类应该是不可变的,除非有很好的理由使它们可变