【问题标题】:What is better to use - abstract method or method with UnsupportedException?什么更好用 - 抽象方法或带有 UnsupportedException 的方法?
【发布时间】:2013-10-17 22:48:14
【问题描述】:

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

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

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

最佳实践是什么:抽象方法还是带有默认不受支持异常的方法?

【问题讨论】:

  • 课程用马。有时一个更好;有时是另一个。

标签: java exception inheritance abstract-class abstract


【解决方案1】:

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

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

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

【讨论】:

  • 你的观点绝对有效,我同意。话虽如此,您能否向我解释一下为什么在AbstractCollection 方法中add 抛出UnsupportedOperationException 而不是抽象
【解决方案2】:

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

这种情况应该很少见,应该避免。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 2011-06-03
        • 2010-12-25
        • 1970-01-01
        • 2020-03-12
        相关资源
        最近更新 更多