1

我已经阅读了有关标记接口的内容,并且对如何在代码中使用它们有了一些了解,但是我不明白为什么我们需要它们以及引入这个概念的原因是什么。

我在互联网上搜索,所有答案都类似于“它们向 JVM 提供了一些基本信息,以便 JVM 可以执行一些有用的操作”,但问题是为什么 JVM 需要知道这一点以及 JVM 有哪些可能的操作必须执行?为什么我不能只克隆对象而不从 Clonable 扩展类?为什么我不能序列化类对象而不从 Serializable 扩展它?

标记界面没有多大意义,在我看来显然不是一个好的设计。没有任何方法的接口???重点是什么?

现在显然这里要使用注释而不是标记接口,但问题仍然是为什么 JVM 需要知道?

4

4 回答 4

5

您清楚地了解标记接口的作用。你自己也是这么说的!

那么为什么我们还需要它们呢?

从某种意义上说,我们不需要它们。您可以使用标记接口表达的任何内容都可以使用注释来表达。毫无疑问,注释是解决问题的一种更简洁的方法。

我们(仍然)拥有标记接口的根本原因是History

  • Java 注释在 Java 5.0 中被添加到 Java 语言中。在此之前,标记接口是可用的最佳解决方案。

  • 从类中删除标记接口会破坏二进制兼容性。

  • 有少量 Java SE 标记接口早于 Java 5.0,并广泛用于用户代码。浮现在脑海中的两个是SerializableCloneable

不管我们喜不喜欢,Java 都有标记接口,而且这不太可能改变。


标记界面没有多大意义,在我看来显然不是一个好的设计。

嗯,是。从2019年的角度来看,确实如此。

从 1997 年的角度来看,当 Java 是新的,而 C# 是 5 年后,唯一带有注释之类的主流(-ish)语言是 LISP 版本。

现在我很确定 Java 1.0 时代的 Java 类库的设计者已经意识到标记接口是一个有缺陷的想法。但他们别无选择。它使用了标记接口,或者将一些漂亮的 Java 基础 API 的设计和实现推迟了 5 年或更长时间。

在企业计算领域,您需要做出妥协才能完成工作。

于 2019-10-29T06:48:07.750 回答
0

任何类都可以在不添加任何额外方法/字段/开销的情况下实现它的点

您只需标记类,它就可以使用/序列化了

即使在引入注解的 Java 5.0 之后,

还有标记注释作为@Configuration

@Configuration 注解用于基于 Spring 注解的配置。@Configuration 是一个标记注解,表示一个类声明了一个或多个 @Bean 方法,并且可以由 Spring 容器处理以在运行时为这些 bean 生成 bean 定义和服务请求

于 2019-10-29T06:27:34.993 回答
0

无需实现 Serializable 即可进行序列化,也无需实现 Cloneable 即可进行克隆。这些接口的重点在于 Java 内置了用于克隆和序列化的机制,如果您希望使用这些内置机制,您只需要实现这些接口。

因此,只需实现 Serializable,您就可以自动将该类与 ObjectInputStream 和 ObjectOutputStream 一起使用,而无需任何额外代码。

另一方面,我觉得可克隆几乎没用。通常,您只需实现 Cloneable 并覆盖Object.clone并将其公开,您就可以立即进行克隆。但据说它被破坏了,你最好只编写自己的克隆逻辑,就像使用复制构造函数一样。

于 2019-10-29T06:43:14.933 回答
0

我可以回答您的部分问题 - java 中标记接口的意义是什么?

通过引入注解,Java 为我们提供了一种替代方法来实现与标记接口相同的结果。此外,像标记接口一样,我们可以将注释应用于任何类,我们可以将它们用作指示符来执行某些操作。

那么关键的区别是什么?

与注解不同,接口允许我们利用多态性。因此,我们可以为标记界面添加额外的限制。

例如,让我们添加一个限制,即只能从数据库中删除 Shape 类型:

public interface Shape {
    double getArea();
    double getCircumference();
}

在这种情况下,我们的标记接口,我们称之为 DeletableShape,将如下所示:

public interface DeletableShape extends Shape {
}

然后我们的类将实现标记接口:

public class Rectangle implements DeletableShape {
    // implementation details
}

因此,所有的 DeletableShape 实现也是 Shape 实现。显然,我们不能使用 annotations 来做到这一点

然而,每个设计决策都有权衡,多态性可以用作反对标记接口的反驳。在我们的示例中,每个扩展 Rectangle 的类都会自动实现 DeletableShape。


这可能无法提供您想要的确切答案。但可以部分帮助你。

资料来源:baeldung.com

于 2021-07-26T12:58:05.290 回答