1

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

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

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

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

4

4 回答 4

2

两者都不应被视为替代方法。not-supported和之间有区别not-implemented,理想情况下我们也应该在代码中维护它。

abstract在没有可能的有效和默认实现的情况下使用方法。

UnsupportedOperationException在不允许/支持操作的方法中使用实现。例如 remove 方法应该在不可修改的集合(Set/List)等中抛出这个异常,参见Collectionsclass. (请注意,默认实现可能是向调用者抛出异常)

于 2013-10-10T09:16:14.970 回答
1

最佳实践取决于应解决的具体问题。

例如,Set接口想要包含操作集合的方法,但也想要提供不允许操作的实现。在后一种情况下,操作尝试会引发异常。

另一方面,想象一个HTTPServlet类似于 中javax.servlet.http抽象基类,但只允许处理 GET 请求。这个类会将doGet方法声明为抽象的,因为没有合理的默认实现,因此它必须由继承类提供。

于 2013-10-10T08:59:07.160 回答
1

我会选择抽象方法。这就是这个东西的用途。在极少数情况下使用UnsupportedOperationException抽象/接口的多个实现,其中大多数实现了一个方法而一个新的实现类没有。

这应该是罕见的,应该避免。

于 2013-10-10T08:59:25.040 回答
0

您已经在问题中给了他们答案:“必须被覆盖” - 您提供的哪些样本迫使您覆盖?abstract

此外,它在编译时显示了问题。

在运行程序之前使用UnsupportedOperationException不会导致任何问题,这在谈论质量软件时为时已晚。而且,如前所述,它有不同的用途。

于 2013-10-10T09:56:18.823 回答