【发布时间】:2025-12-05 14:05:01
【问题描述】:
我有一个 JAVA 类 A,它有一个方法 foo
abstract class A {
abstract void foo();
}
我还有一个 A 的派生类 - MutableA。 MutableA 是一个单例对象,指示不需要更新,这对于重用代码流很有用。 永远不应该在 MutableA 上调用 foo()。 实现这一目标的最佳方法是什么:
- 抛出不支持的异常
- 什么都不做(空实现)
- 这是一个糟糕的设计。
有人可以推荐我在这种情况下的最佳做法是什么吗?
【问题讨论】:
-
这真的取决于
foo应该做什么的细节。这些选项中的任何一个都可能适用。 -
可以考虑做Guava
Immutable*类做的事情,就是标记这样的方法@Deprecated。这不会阻止你调用它们,但至少你的 IDE(如果你使用了)可以给你一个提示,提示你有什么事情发生了,只要你有对MutableA的特别引用。 -
如果您想从 Google 的 Guava 中汲取灵感,如果您在不可变结构上调用变异集合方法,他们会抛出
UnsupportedOperationException。他们还将方法标记为@Deprecated。 -
Best practice for implementing a derived method that shouldn't be called... 是矛盾的。对于本质上是黑客攻击和违反良好继承设计的行为,没有“最佳实践”。要么正确实现继承,要么支持组合。也许您的设计过于粗粒度。当然,如果你被一些可怕的遗留代码库 / api 所困,所有的敏感性都被抛到窗外,你可以忽略我刚才所说的
标签: java inheritance object-oriented-analysis