有没有更好的Marker方法?

自Java 1.5推出以来,就是否在Java中使用Marker接口进行了广泛的讨论和辩论。 这是因为Java 1.5引入了注释功能,这些功能几乎可以解决Marker接口的目的。 本文将涵盖这场辩论的一个有趣的部分。
定义:
Java中的标记接口是一个空接口,没有任何方法,字段或常量。 有时也称为标记接口。


那么为什么使用Marker接口呢?

有效的问题! 它没有解决与定义实现该接口的类的协定的接口的目的。 这些接口定义了没有实现的方法,因为它们告诉子类需要做什么,但是由子类决定如何实现此方法。 但是,在Marker接口的情况下,没有成员。

标记接口是一种声明有关类的元数据的方法。 它告诉JVM,需要以不同的方式对实现标记器接口的类的对象进行特殊处理。 Java API中定义了一些现成的Marker接口:
java.io.Serializable
java.lang.Cloneable java.util.RandomAccess java.util.EventListener 我们还可以像创建其他接口一样创建自己的标记接口版本。

让我们更深入地了解Cloneable接口。 当需要在Java中克隆对象时,我们使用Object的clone()方法。 但是请注意,此方法不是Cloneable接口的一部分,即,当您的类默认实现Cloneable接口时,将不会像其他任何标准接口一样实现clone方法。 当我们显式定义它或调用对象的clone方法时,就可以完成此操作。
因此,不可能仅凭借对象实现此接口的事实来克隆对象。 即使克隆方法是反射式调用的,也不能保证它会成功。

public Object clone() {Object clone = null;try {clone = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;
}

这里的一个关键点是,当您尝试使用clone()方法克隆对象时,除非实现Cloneable接口,否则将获得CloneNotSupportedException 。 JVM非常聪明–是吗?

注意事项:

如前所述,除了使用内置的标记接口之外,我们还可以创建特定于应用程序的标记接口,因为这是标记和逻辑分类代码的一种好方法。 这在尝试创建框架或开发API时主要有用。

有趣的一点:

Runnable不是Marker接口。 尽管run是对JVM启动方法的特殊指令,但是Runnable不是标记接口,因为Runnable内部具有公共的void run()方法。

标记界面存在问题:

标记接口的主要问题是接口定义了用于实现类的协定,并且该协定被所有子类继承。 这意味着您不能取消实施标记。 如果创建不想序列化的子类(可能是因为它依赖于瞬时状态),则必须诉诸显式抛出NotSerializableException .

现在让我们回到重点。 使用注释比标记界面更好吗?

为了回答这个问题,让我们更详细地研究Java注释。

定义:
Java注释是Java 1.5中引入的语法元数据(关于数据的数据)的特殊形式。 像Java类一样,接口甚至注释都可以在多个Java元素上使用。

标记界面与标记注释

与Javadocs不同,Annotations具有更多功能,可帮助在运行时进行处理。 注释用于程序包或类声明,方法声明,字段声明和变量声明中。 它减少了编码工作,让开发人员可以轻松开发,专注于业务逻辑,从而提高了自动化程度。

注释与标准Java元素之间用“ @”符号分隔。 每当编译器遇到带有任何Java元素的这些注释时,它都会从注释中提取信息并自动生成代码。

注释的用途:

  • 将信息传递给编译器–用于检测错误或抑制警告。 例如@ SuppressWarnings,@不建议使用
  • 编译时间和部署时间处理–几种工具可以处理注释信息以生成代码XML文件等。诸如Spring,Hibernate之类的框架大量使用注释。
  • 运行时处理–仅在运行时处理这些批注。

以标记接口的类似方式,我们也有标记注释。 标记注释没有任何方法或元素。 该行为与Marker接口相同。

例如, @ Override是内置的Java Marker批注类型,可以将其实现为方法,以指示编译器编译器该方法将覆盖超类中的方法。 它不包含任何其他程序元素。 如果您在不覆盖超类方法的方法上使用此批注,则编译器将发出编译错误,以提醒您该事实。 这种注释类型可以防止程序员在重写方法时犯错误,因为开发人员很可能实际上会在超类中重载方法而不是重写。

似乎批注比标记界面更好,因为批注可以达到相同的效果。

  • 它可以标记变量,方法和/或类。
  • 它可以专门标记任何类,也可以通过继承标记。 标记接口将标记已标记类的所有子类。 例如,如果我们必须将一个类标记为不可序列化,则必须专门将其标记为瞬态。 这可能是值得商bat的,因为注释不是不可子类化的,可能是优点还是缺点。 注释默认情况下不会继承– isAnnotationPresent()会告诉您该特定类上是否存在该注释,而不是它是否存在于超类或超接口上。 因此,如果您作为批注旨在提供的特殊功能的实现者,希望批注的行为像继承一样,则不仅要检查此类 ,还要检查每个超类和每个超接口的isAnnotationPresent()
  • 您可以将数据添加到标记中。 换句话说,非空白的注释具有价值,因为您所标记的不仅仅是类型。

因此,他们每个人都有一定的优点和缺点,我个人认为应该由开发人员来决定是否使用标记界面或标记注释,因为他们必须决定考虑实际情况并判断优点和缺点。他们两个,并确定最适合该要求的。

参考: 是否有更好的Marker方法? 从我们的JCG合作伙伴 Mainak Goswami在Idiotechie博客上获得。

标记 2012-10-30

迈纳克·高斯瓦米(Mainak Goswami)

翻译自: https://www.javacodegeeks.com/2012/10/is-there-a-better-approach-to-marker.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php jquery ajax登录,jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)

弹出层主要用于展示丰富的页面信息,还有一个更好的应用是弹出表单层丰富交互应用。常见的应用有弹出登录表单层,用户提交登录信息,后台验证登录成功后,弹出层消失,主页面局部刷新用户信息。本文我们将给大家介绍如何使…

# 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod

20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多练习linux的命令训练。 实践一 每个* .c一个文件,每个*.h一…

CometD:Java Web应用程序的Facebook类似聊天

聊天就像吃一块蛋糕或喝一杯热咖啡一样容易。 您是否曾经考虑过自己开发聊天程序? 您知道,聊天不容易。 但是,如果您是开发人员,并且阅读了本文的结尾,则可以尝试自己开发一个聊天应用程序,并允许您的用户通…

怎么用PHP建立购物网站,如何使用PHP建设一个购物网站

本系统以PHP为主要制作工具,实现了用户注册、登录、验证身份及用户数据的采集、物品的预览查询、搜索/查看物品信息,站内最新物品信息发布,可进入在线下单从而实现了网络销售。网上购物,这个逐渐流行于二十世纪的购物方式已经为越…

团队作业2——需求分析原型设计

需求分析: 软件的最终目的是用来解决用户的某些问题,需求分析就是要理解要解决的问题,真正明确用户需求。请发表一篇随笔,完成初步的需求分析: 1.访问软件项目的真实用户(至少10个),…

给div命名,使逻辑更加清晰

我们把一些标签放进<div>里&#xff0c;划分出一个独立的逻辑部分。为了使逻辑更加清晰&#xff0c;我们可以为这一个独立的逻辑部分设置一个名称&#xff0c;用id属性来为<div>提供唯一的名称&#xff0c;这个就像我们每个人都有一个身份证号&#xff0c;这个身份…

css边框颜色渐变

在实际开发中&#xff0c;我们经常遇见边框需要背景渐变的实现要求&#xff0c;那么如何去实现呢&#xff0c;今天给大家分享依稀几种情况 1.直角的背景渐变 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta…

170406、用uid分库,uname(用户名)上的查询怎么办

【缘起】 用户中心是几乎每一个公司必备的基础服务&#xff0c;用户注册、登录、信息查询与修改都离不开用户中心。 当数据量越来越大时&#xff0c;需要多用户中心进行水平切分。最常见的水平切分方式&#xff0c;按照uid取模分库&#xff1a; 通过uid取模&#xff0c;将数据分…

bzoj2144: 跳跳棋(二分/倍增)

思维好题&#xff01; 可以发现如果中间的点要跳到两边有两种情况&#xff0c;两边的点要跳到中间最多只有一种情况。 我们用一个节点表示一种状态&#xff0c;那么两边跳到中间的状态就是当前点的父亲&#xff0c;中间的点跳到两边的状态就是这个点的两个儿子&#xff0c;从而…

电脑投屏软件哪个好_目前当贝市场中投屏软件哪个好,最全面投屏技巧盘点

现在不管是在家里还是公司里&#xff0c;为了看一些是视频和资料&#xff0c;投屏到电视上是一件非常必要的事情&#xff0c;但是现在投屏的技巧各种各样&#xff0c;投屏的软件也是五花八门&#xff0c;小编平常也是经常投屏&#xff0c;也试过非常多的方法&#xff0c;这边分…

从零开始的全栈工程师——html篇1.2

起名方式与CSS 一.起名方式(起名方式也叫选择器) 起名的目的是为了给标签添加属性 常见的3种选择器有 标签选择器 id选择器(使用的时候加#) class选择器(使用的时候加.) 样式的要求是由选择器的权重来决定的 标签的权重为1 class的权重是10 id的权重是100 权重是可…

Spring:设置日志依赖项

这篇文章描述了如何在Spring中设置日志依赖。 它基于Dave Syer的帖子中提供的信息 。 这里提供有关Java日志记录框架的提醒。 该代码示例可在GitHub的Spring-Logging-Dependencies目录中找到。 Spring使用Jakarta Commons Logging API&#xff08;JCL&#xff09;。 不幸的是&…

安卓app开发工具_怎么开发app软件需要多少钱?主流app开发工具盘点

现在智能手机的快速普及让手机app在生活中越来越重要&#xff0c;很多企业及创业者也意识到了app的重要性&#xff0c;但是怎么开发app软件&#xff1f;有哪些主流app开发工具呢&#xff1f;这里就为大家分享一下如何快速开发app软件。一、编程app开发工具主要针对专业的程序员…

大话设计模式读书笔记(十一) 观察者模式

观察者模式&#xff1a; 书中通过小菜描述同事在公司看股票行情&#xff0c;并请求前台帮忙在老板回来时提醒同事&#xff0c;引出需求。将前台通知同事老板回来的事写成程序。未用模式实现&#xff1a; 1 //前台类2 public class Secretary {3 private List<StockObser…

解决高度塌陷

<!DOCTYPE html> <html lang"en" dir"ltr"><head><meta charset"utf-8"><title>高度塌陷解决</title><style media"screen">.box1{border: 10px #bfc993 solid;}.box2{width: 100px;height…

IBM AIX:Java进程大小监视

本文将为您提供有关如何计算在IBM AIX 5.3 OS上运行的Java VM进程的Java进程大小内存占用量的快速参考指南。 这是我关于该主题的原始文章的补充文章&#xff1a; 如何在AIX上监视Java本机内存 。 我强烈建议所有参与生产支持或AIX上部署Java应用程序开发的人员阅读此书。 为…

pstate0 vid数值意义_天体运动的简单数值计算

&#xff08;建议阅读全文&#xff09; 预备知识 万有引力&#xff0c; 弹簧振子受迫运动的简单数值计算    下面我们来用一种极其简单的算法对单个天体在中心天体的万有引力作用下的运动进行数值计算&#xff0e; 事实上该问题存在解析解&#xff08;见开普勒三定律&#x…

集合框架

集合框架包含的内容&#xff1a; 集合框架的接口&#xff1a; List接口实现类 ArrayList 1 package com.jredu.ch01;3 import java.util.ArrayList;5 import java.util.List;7 public class ArrayListTest {9 public static void main(String[] args) { 10 // TODO…

Java中的类型安全的空集合

我之前曾在Java Collections类的实用程序上进行过博客撰写&#xff0c;并且特别地在使用Usings Collections Methods上的博客emptyList&#xff08;&#xff09;&#xff0c;emptyMap&#xff08;&#xff09;和emptySet&#xff08;&#xff09;上进行了博客撰写。 在本文中&a…

剑指offer二十二之从上往下打印二叉树

一、题目 从上往下打印出二叉树的每个节点&#xff0c;同层节点从左至右打印。 二、思路 二叉树的层次遍历&#xff0c;可以借助队列实现。具体思路详见注释。 三、代码 import java.util.ArrayList; import java.util.LinkedList; /** public class TreeNode {int val 0;Tree…