【问题标题】:Marker Interfaces: Runtime vs compile time errors标记接口:运行时与编译时错误
【发布时间】:2015-02-13 10:32:29
【问题描述】:

所以阅读 Java 中的标记接口概念时,我感觉有点不对劲,主要是因为我参与编写应用程序,而程序遇到运行时错误是一场灾难。

就设计而言,当我可以通过使用抽象类来避免运行时错误时,为什么我会在存在运行时错误风险的情况下使用标记接口。

我一直认为我会避免运行时错误,即使我可能会通过产生编译时错误来限制代码。

标记接口不会导致更高的失败风险,尤其是当越来越多的开发人员不会真正阅读那里的每一行文档时(不是我,我是好人之一)

也许它只是我脑海中的 C++,但是这样设计有什么好处吗?

【问题讨论】:

  • 好吧,没有人喜欢在运行时失败的程序;我不明白你的意思是什么?请注意,如果可以帮助您,您可以使用 @Documented 注释
  • 在我看来,标记接口应该被视为已弃用,因为大多数用途注释更好。
  • @fge,使用标记接口,您不会强制任何编译时间限制,因此可能会导致运行时错误的可能性更高。那我为什么要使用它。
  • 当然你可以强制执行。您可以在您的 API 中要求市场接口是 imlemwnte,如果不是,编译错误将会出错。你的问题没有意义。
  • @EJB,我们以 Cloneable 作为标记接口为例。在这种情况下,对实现者实际提供克隆功能没有任何限制。如果我使用抽象类实现了纯虚函数,我会在编译过程中捕获它

标签: java interface compilation runtime


【解决方案1】:

标记接口是在 Java 早期版本中声明类元数据的唯一方法,例如 Serializable 表示在调用序列化/反序列化时实现类将正确运行。

今天,Marker 接口对我来说有点多余(或过时),因为它们可以被 Annotations 取代,它允许以非常灵活的方式描述类元数据。

刚刚从 Joshua Bloch 那里找到了一个 quote...

您可能听说过标记注释(第 35 项)使标记接口过时。这种说法是不正确的。与标记注释相比,标记接口有两个优点。首先,标记接口定义了由标记类的实例实现的类型;标记注释没有。这种类型的存在使您可以在编译时捕获错误,如果您使用标记注释,则直到运行时才能捕获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2014-10-18
    相关资源
    最近更新 更多