4 回答
TA贡献1805条经验 获得超10个赞
您清楚地了解标记接口的作用。你自己也这么说啊!
那么为什么我们还需要它们呢?
从某种意义上说,我们不需要它们。任何可以用标记接口表达的东西都可以用注释来表达。毫无疑问,注释是解决问题的一种更简洁的方法。
我们(仍然)拥有标记接口的根本原因是历史:
Java 注释是在 Java 5.0 中添加到 Java 语言中的。在此之前,标记接口是可用的最佳解决方案。
从类中删除标记接口会破坏二进制兼容性。
有少量 Java SE 标记接口早于 Java 5.0,并广泛用于用户代码中。我想到的两个是
Serializable
和Cloneable
。
无论我们喜欢与否,Java 都有标记接口,而且这一点不太可能改变。
标记界面没有多大意义,在我看来显然不是一个好的设计。
嗯,是。从2019年的角度来看,确实如此。
从 1997 年的角度来看,当时 Java 还很新,C# 也已经面世 5 年了,唯一具有注释之类的主流语言是 LISP 版本。
现在我非常确定,早在 Java 1.0 时代,Java 类库的设计者就意识到标记接口是一个有缺陷的想法。但他们别无选择。它是使用标记接口,或者将一些漂亮的 Java 基础 API 的设计和实现推迟 5 年或更长时间。
在企业计算领域,您需要做出妥协才能完成工作。
TA贡献1784条经验 获得超8个赞
您不需要实现 Serialized 来进行序列化,也不需要实现 Cloneable 来进行克隆。这些接口的要点在于,Java 内置了用于克隆和序列化的机制,如果您希望使用这些内置机制,则只需实现这些接口即可。
因此,只需实现 Serialized,您就可以自动将该类与 ObjectInputStream 和 ObjectOutputStream 一起使用,而无需任何额外的代码。
另一方面,我发现可克隆几乎毫无用处。通常,您只需实现 Cloneable 并覆盖Object.clone
并将其公开,然后您就可以立即进行克隆。但据说它被破坏了,你最好只编写自己的克隆逻辑,就像使用复制构造函数一样。
TA贡献1893条经验 获得超10个赞
我可以回答你的部分问题 - 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 实现。显然,我们不能使用注释来做到这一点。
然而,每个设计决策都需要权衡,多态性可以用作针对标记接口的反驳。在我们的示例中,每个扩展 Rectangle 的类都会自动实现 DeletableShape。
这可能无法提供您想要的确切答案。但可以部分帮助你。
TA贡献1831条经验 获得超9个赞
任何类都可以实现它而无需添加任何额外的方法/字段/开销
您只需标记类即可使用/序列化
即使在 Java 5.0 引入注释之后,
仍然还有@Configuration标记注释
@Configuration注解用于基于Spring注解的配置。@Configuration 是一个标记注释,它指示一个类声明一个或多个 @Bean 方法,并且可以由 Spring 容器处理以在运行时生成 bean 定义和这些 bean 的服务请求
添加回答
举报