javadoc 标签_新的Javadoc标签@ apiNote,@ implSpec和@implNote

javadoc 标签

如果您已经在使用Java 8,则可能会看到一些新的Javadoc标签: @apiNote@implSpec@implNote 。 他们怎么了? 如果要使用它们,该怎么办?

总览

该帖子将快速查看标签的来源和当前状态。 然后,它将解释它们的含义并详细说明如何将它们与IDE,Javadoc工具一起使用,以及如何通过Maven的Javadoc插件使用。

我在GitHub上创建了一个演示项目,以显示一些示例和Maven pom.xml的必要补充。 为了使Maven规避变得更容易,它已经包含了生成的javadoc 。

语境

起源

新的Javadoc标记是JSR-335的副产品,它引入了lambda表达式。 它们是在默认方法的上下文中提出的,因为它们需要更标准化和更细粒度的文档。

2013年1月,Brian Goetz 提出了动机,并为这些新标签提出了建议 。 经过简短的讨论,三个星期后它变成了功能请求 。 到4月, JDK Javadoc制造商已更新 , 邮件列表通知他们可以使用了。

当前状态

重要的是要注意,新标签未正式记录(在Javadoc标签的正式列表中丢失),因此可能会发生变化。 此外,实施者Mike Duigou 写道 :

没有计划在JDK文档使用范围之外尝试普及这些特定标签。

因此,虽然理解它们的含义肯定有益,但是团队应该仔细考虑使用它们是否值得依靠无证行为带来的风险。 我个人认为,我认为已经在JDK上进行了大量投资,以至于无法撤消。 如果有必要,也可以在代码库中轻松删除或搜索/替换它们的出现。

由布鲁克林博物馆根据CC-BY 3.0发布。

由布鲁克林博物馆根据CC-BY 3.0发行 。

让我们切入事物的核心。 这些新标签的含义是什么? 它们在哪里以及如何使用?

含义

新的Javadoc标记在功能请求的说明中进行了很好的解释(我对布局进行了一些更改):

关于API中的方法,我们可能要记录很多事情。 从历史上看,我们将它们定义为“规范”(例如,必要的后置条件)或“实施说明”(例如,使用户了解引擎盖发生了什么的提示。)但是,实际上,有四个方框(和我们已经将它们塞入了两个,或者实际上是1.5):

{API,实现} x {规范,注释}

(我们有时使用规范性/信息性术语来描述规范/注释之间的差异。)以下是每个框中的内容的一些描述。

1. API规范。
这是我们认识和喜爱的。 一种描述,该描述同样适用于该方法的所有有效实现,包括前提条件,后置条件等。

2. API注释。
与API有关的评论,原理或示例。

3.实施规范。
在这里,我们说的是成为有效的默认实现(或类中的可重写实现)的含义,例如“ throws UOE”。 同样,这是我们描述putIfAbsent的默认值的putIfAbsent 。 正是从这个盒子中,将要实施的人获得了足够的信息,以就是否要覆盖做出明智的决定。

4.实施说明。
有关实现的信息性注释,例如特定于此版本此JDK中此类中的实现的性能特征,并且可能会发生变化。 允许这些内容在平台,供应商和版本之间有所不同。

建议:添加三个新的Javadoc标记@apiNote@implSpec@implNote 。 (剩下的框,API Spec,不需要新标签,因为已经使用了Javadoc。) @impl {spec,note}可以很好地应用于类中的具体方法或接口中的默认方法。

因此,新的Javadoc标记旨在对注释中给出的信息进行分类。 它区分方法的规范,类的规范...(与API的所有用户有关–这是“常规”注释,如果有的话将为@apiSpec ),以及其他更短暂或不太通用的文档。 更具体地说,API用户不能依赖任何用@implSpec@implNote编写的内容 ,因为这些标记与方法的这种实现有关,而没有提及重写实现。

这表明使用这些标签将主要使API设计人员受益。 但是在这种情况下,即使是从事大型项目的Joe Developer也可以被视为设计师,因为他的代码肯定会在将来的某个时候被同事使用和/或更改。 在这种情况下,如果注释清楚地描述了API的不同方面,将很有帮助。 例如,它是方法规范的“线性运行”部分(因此不应降级)或当前实现的详细信息(因此可以更改)。

例子

让我们看一些例子! 首先从演示项目中展示如何使用标签的基本原理,然后从JDK看到其在生产中的使用。

彩票

该项目包含一个虚拟库中的界面Lottery 。 该接口最初包含在库的1.​​0版中,但是必须为1.1版添加新方法。 为了保持向后兼容性,这是默认方法,但是计划是在2.0版中使其抽象(给客户一些时间来更新其代码)。

使用新标签,该方法的文档可以清楚地区分其文档的含义:

Lottery.pickWinners的文件

/*** Picks the winners from the specified set of players.* <p>* The returned list defines the order of the winners, where the first* prize goes to the player at position 0. The list will not be null but* can be empty.** @apiNote This method was added after the interface was released in*          version 1.0. It is defined as a default method for compatibility*          reasons. From version 2.0 on, the method will be abstract and*          all implementations of this interface have to provide their own*          implementation of the method.* @implSpec The default implementation will consider each player a winner*           and return them in an unspecified order.* @implNote This implementation has linear runtime and does not filter out*           null players.* @param players*            the players from which the winners will be selected* @return the (ordered) list of the players who won; the list will not*         contain duplicates* @since 1.1*/
default List<String> pickWinners(Set<String> players) {return new ArrayList<>(players);
}

JDK

JDK广泛使用新标签。 一些例子:

  • ConcurrentMap
    • 几个@implSpec定义默认实现的行为,例如在replaceAll
  • Objects使用@apiNote解释为什么添加了看似无用的方法isNullnonNull
  • 抽象类Clock在其类注释中使用@implSpec@implNote来区分必须注意哪些实现以及如何实现现有方法。

遗产

当覆盖方法没有注释或通过{@inheritDoc}继承其注释时,不包括新标记。 这是一件好事,因为它们通常不适用。 要继承特定标签,只需将片段@tag {@inheritDoc}到注释中。

演示项目中的实现类检查了各种可能性。 自述文件提供了概述。

工具支援

集成开发环境

您可能希望在IDE中看到改进的文档(JDK的文档,也许是您自己的文档)。 那么,当前最受欢迎的人如何处理它们?

Eclipse显示标签及其内容,但不提供特殊的呈现方式,例如对标签标题进行排序或整理。 有一个功能要求来解决此问题。

IntellyJ的当前社区版本14.0.2既不显示标签也不显示其内容。 这显然已在平安夜解决(请参见票证 ),所以我想下一个版本将不再有此问题。 不过,我无法透露任何有关渲染的信息。

NetBeans既不显示标签也不显示内容,我找不到任何票证可以解决此问题。

总而言之,这不是一个漂亮的图片,但考虑到这不是官方的Javadoc功能,这是可以理解的。

生成Javadoc

如果您开始在自己的代码中使用这些标记,您将很快意识到由于未知标记,生成Javadoc失败。 这很容易解决,您只需要告诉它如何处理它们即可。

命令行

这可以通过命令行参数-tag来完成。 以下参数允许这些标签随处可见(例如,在软件包,类型,方法等上),并为它们提供JDK当前使用的标头:

向Javadoc讲述新标签

-tag "apiNote:a:API Note:"
-tag "implSpec:a:Implementation Requirements:"
-tag "implNote:a:Implementation Note:"

(我阅读了官方文档,好像这些参数应该是-tag apiNote:a:“ API注意:” [请注意引号],但这对我不起作用。如果您想限制使用新标签或完全不包含它们, -tag的文档告诉您如何执行此操作。)

默认情况下,所有新标签都添加到生成文档的末尾,这会将它们放在下面,例如@param@return 。 要更改此设置,必须按所需顺序列出所有标签,因此必须将已知标签添加到上述三个标签下方的列表

在新标签之后列出已知标签

-tag "param"
-tag "return"
-tag "throws"
-tag "since"
-tag "version"
-tag "serialData"
-tag "see"

Maven

Maven的Javadoc插件具有配置设置标记 ,该标记用于详细创建相同的命令行参数。 GitHub上的演示项目展示了pom中的外观 。

反射

我们已经看到添加了新的Javadoc标记@apiNote@implSpec@implNote ,以允许将文档划分为具有不同语义的部分。 了解它们对每个Java开发人员都有帮助。 API设计人员可能选择在他们自己的代码中使用它们,但必须记住,它们仍然没有文档记录,因此可能会发生变化。

我们最终看了一些涉及的工具,发现需要改进IDE支持,但是可以对Javadoc工具和Maven插件进行参数化以充分利用它们。

翻译自: https://www.javacodegeeks.com/2015/01/new-javadoc-tags-apinote-implspec-and-implnote.html

javadoc 标签

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

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

相关文章

c语言万年历附加功能,万年历(c语言,多功能).doc

万年历(c语言,多功能)#include "time.h" /*包含的头文件*/#include "stdio.h"#include "math.h"#include "windows.h"#include "conio.h"#define KEYNUMUp 0x48 /*宏定义*/#define KEYNUMDown 0x50#define KEYNUMLeft 0x4b#…

联想小新300加固态_就联想小新 Pro 13 固态硬盘混用一事,官方回应

IT之家11月3日消息 近日有用户反馈称&#xff0c;联想小新Pro 13的部分批次固态硬盘从三星PM981A换成亿联了&#xff0c;因此还出现了退货现象。针对上述情况&#xff0c;联想官方刚刚发表声明回应此事。以下为联想回应全文&#xff1a;有关小新Pro 13固态硬盘(SSD)配置问题的公…

C语言入门基础之输入和输出

标准输入函数在stdio.h中scanf声明如下&#xff1a;/* Read formatted input from stdin.This function is a possible cancellation point and therefore notmarked with __THROW. */ extern int scanf (const char *__restrict __format, ...) __wur;使用Mac或Linux的同学&am…

camel java_与Java EE和Camel的轻量级集成

camel javaEnterprise Java具有不同的风格和观点。 从简单的平台技术&#xff08;众所周知的Java EE&#xff09;开始&#xff0c;到不同的框架和集成方面&#xff0c;最后是涉及以数据为中心的用户界面或特定可视化效果的用例。 Java EE本身无法解决的最突出的问题是“集成”。…

c语言 伪随机数程序,C语言的伪随机数

一直想好好的系统的学习一下C语言的伪随机数&#xff0c;今天终于逮到机会了伪随机数C语言中有可以产生随机数据的函数&#xff0c;需要添加stdlib.h和time.h头文件。首先在main函数开头加上srand(unsigned)time(NULL))。先来介绍一下srand头文件&#xff1a;定义函数&#xff…

最大隶属度原则_模糊数学笔记:六、模糊模型识别-I(最大隶属度原则)

1、模型识别的问题提出模型识别&#xff0c;通俗地理解即是对一个类别未知的对象进行归类&#xff08;或者叫分类&#xff09;。这里与聚类不同的是&#xff0c;聚类实际上是要区分出已有的样本哪些属于同一类&#xff0c;但并没有参考标准。而识别则事先有参考的标准&#xff…

C语言经典题

C 库函数 - tanh()描述C 库函数 double tanh(double x) 返回 x 的双曲正切。声明下面是 tanh() 函数的声明。double tanh(double x)参数x -- 浮点值。返回值该函数返回 x 的双曲正切。实例下面的实例演示了 tanh() 函数的用法。#include#include int main (){ double x, ret;…

用c语言产生大素数,C语言实现寻找大素数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼找到一亿内所有素数并写入文件用时 35秒.#include "math.h"#include "stdio.h" #include "stdlib.h" #include "time.h"int isP(int num,int *p) { int i; int lenp[0]; int flag1; p;for…

java ee自动生成编码_EE Servlet 3:在Servlet中生成HTML输出

java ee自动生成编码如果您只需要在EE Web模块中处理少量请求URI&#xff0c;那么在Servlet代码中生成自己HTML响应可能比使用完整的模板库更容易。 作为示例的一部分&#xff0c;我尝试了一个非常简单的Java DSL&#xff0c;该Java DSL在编写自己的Serlvet时生成html输出。 代…

jq 控制td只显示一行_CSS让表格里的内容强制显示一行,超出长度显示省略号

在写html页面的时候&#xff0c;会经常用到表格&#xff0c;而且很多时候一个tr里边需要包含好几个td&#xff0c;这样就会导致tr的高度不一致&#xff0c;被撑开了这时候&#xff0c;如果能让td里的内容强制显示在一行&#xff0c;并让超出边界范围的内容显示点点&#xff0c;…

C++11的模板改进

C11关于模板有一些细节的改进&#xff1a;模板的右尖括号模板的别名函数模板的默认模板参数模板的右尖括号C11之前是不允许两个右尖括号出现的&#xff0c;会被认为是右移操作符&#xff0c;所以需要中间加个空格进行分割&#xff0c;避免发生编译错误。int main() {std::vecto…

java面试题2014_Java生态系统– 2014年我的5大亮点

java面试题20141月1日-RedMonk Analyst公司宣布Java比以往任何时候都更加流行和多样化&#xff01; 2014年&#xff0c;随着FOSDEM的Free Java会议室的年会&#xff0c;Java生态系统开始轰轰烈烈地响起。 除了关于OpenJDK和相关主题的许多精深的技术讲座外&#xff0c;Steve OG…

android 第三方圆弧进度条,android 可配置的圆弧进度条

Arc ProgressBar Configurable 圆弧环形进度条DEMOAttributesnameformatdescriptionborderWidthinteger圆弧边框的宽度progressStyletick/arc进度条类型&#xff0c;tick 为带刻度的radiusinteger半径arcbgColorcolor圆弧的边框背景degreeinteger弧度&#xff0c;设置为 0 即为…

三分钟让孩子的数学开窍

周末给孩子灌了一个世界观和方法论&#xff1a;用笛卡尔坐标系描述世界。 我强调&#xff0c;学习笛卡尔坐标系不是做题&#xff0c;它是工具&#xff0c;它是帮你解题的&#xff0c;而不是为难你的。 任何数学题放在笛卡尔坐标系都可以通过机械的方法硬算&#xff0c;计算过程…

oracle大对象实例_超大型Oracle数据库设计实例

超大型系统的特点为&#xff1a; 1.处理的用户数一般都超过百万&#xff0c;有的还超过千万&#xff0c;数据库的数据量一般超过1TB&#xff1b; 2.系统必须提供实时响应功能&#xff0c;系统需不停机运行&#xff0c;要求系统有很高的可用性及可扩展性。 这篇是笔者针对以上特…

C++定时器的实现之格式修订版

个人认为一个完备的定时器需要有如下功能&#xff1a;在某一时间点执行某一任务在某段时间后执行某一任务重复执行某一任务N次&#xff0c;任务间隔时间T那么如何实现定时器呢&#xff1f;下面是我自己实现的定时器逻辑&#xff0c;源码链接最后会附上。定时器中主要的数据结构…

java 性能调优_Java性能调优调查结果(第四部分)

java 性能调优这是本系列中的最后一篇文章&#xff0c;我们将分析我们在2014年10月进行的Java Performance Tuning Survey的结果。如果您尚未阅读第一篇文章&#xff0c;建议您首先阅读以下内容&#xff1a; 性能问题的频率和严重性 最受欢迎的监控解决方案 查找根本原因的工…

Android接入热敏打印机,Android 关于佳博和汉印蓝牙热敏打印机开发

接上篇文章Android之BLE(低功耗)蓝牙开发&#xff0c;本篇文章针对上篇博文中提出的两款打印机的开发流程进行记录。首先不管时佳博打印机还是汉印打印机&#xff0c;都是先对他们各自的lib进行导入&#xff0c;如图&#xff1a;导入lib之后&#xff0c;一定要记得进行sync pro…

C 桥接模式 - 开关和电器

桥接模式&#xff08;Bridge Pattern&#xff09;是将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。1模式结构UML 结构图&#xff1a;Abstraction&#xff08;抽象类&#xff09;&#xff1a;用于定义抽象类的接口&#xff0c;并且维护一个指向 Implementor…

centos8配置本地光盘yum源_CentOS8 配置本地yum源的详细教程

centos8发行版通过 baseos 和应用流 (appstream) 仓库发布&#xff0c;appstream 是对传统 rpm 格式的全新扩展&#xff0c;为一个组件同时提供多个主要版本centos8 自带封装了nginx&#xff0c;这篇文章给大家介绍centos8 配置本地yum源&#xff0c;具体内容如下所示&#xff…