什么是更好的使用 - 具有UnsupportedException的抽象方法或方法?

时间:2013-10-10 08:56:15

标签: java exception inheritance abstract-class abstract

假设我有2个基类,其方法必须在子类中重写:

public abstract class Base1 {
    protected abstract void method();
}

public abstract class Base2 {
    protected void method() {
        throw new UnsupportedOperationException();
    }
}

使用的最佳做法是什么:具有默认不支持异常的抽象方法或方法?

4 个答案:

答案 0 :(得分:2)

两者都不应被视为替代方法。 not-supportednot-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不会导致任何问题,这在讨论高质量软件时为时已晚。而且,如前所述,它有不同的用途。