假设我有2个基类,其方法必须在子类中重写:
public abstract class Base1 {
protected abstract void method();
}
public abstract class Base2 {
protected void method() {
throw new UnsupportedOperationException();
}
}
使用的最佳做法是什么:具有默认不支持异常的抽象方法或方法?
答案 0 :(得分:2)
两者都不应被视为替代方法。 not-supported
和not-implemented
之间存在差异,理想情况下我们也应该在代码中保留这一点。
在没有有效和默认实现的情况下使用abstract
方法。
在不允许/不支持操作的方法中使用UnsupportedOperationException
实现。例如,remove方法应该在Unmodifiable collections(Set / List)等中抛出此异常,请参阅Collections
类。 (注意这里可能的默认实现是向调用者抛出异常)
答案 1 :(得分:1)
最佳实践取决于应解决的具体问题。
例如,Set
接口想要包含操作集合的方法,但也希望提供不允许操作的实现。在后一种情况下,操纵尝试会抛出异常。
另一方面,想象一下类似于the one in javax.servlet.http
的抽象基类HTTPServlet
,但只允许处理GET请求。这个类将doGet
方法声明为抽象,因为没有合理的默认实现,因此必须由继承类提供。
答案 2 :(得分:1)
我会选择抽象的方式。这就是这个用途。
在稀有条件下使用UnsupportedOperationException
,其中有多个抽象/接口实现,并且大多数实现方法而新实现类不实现。
这应该是罕见的并且应该避免。
答案 3 :(得分:0)
你已经在问题中给出了答案:“必须被覆盖” - 你提供的样本强制你要覆盖哪些? abstract
此外,它在编译时显示问题。
在运行程序之前使用UnsupportedOperationException
不会导致任何问题,这在讨论高质量软件时为时已晚。而且,如前所述,它有不同的用途。