我读或听过如下句子:
Java Persistence API(JPA)是一个Java应用程序编程接口规范......
要么
JavaServer Faces(JSF)是一个Java规范......
但我不确定我是否理解规范到底是什么
让我们说我创建了一个新的规范JMA,Java Math API,它是一个Java数学规范.
我将我的规范定义如下:
JMA必须提供一个添加两个整数的方法吗?
或者,我是否必须创建一个类似的文档:
JMA必须提供方法:int jmaAdd(int x,int y)?
或者,我是否必须创建接口并分发源代码?
public interface JMA{ int jmaAdd(int x,int y); }
或者我是否必须编译接口并将其发布为jar?
另外,规范是否可以包含抽象类或类?或者它必须只包含接口?
什么是规范,规范?
我将我的规范定义如下:
JMA必须提供一个添加两个整数的方法吗?
这是一个规范.
它不是一个非常有用的,因为它没有为用户提供该规范实现的许多保证.如果我想编写一个添加两个整数的程序,我只能通过阅读规范来做到这一点.
但它确实为实现者提供了很大的自由.通常,您希望您的规范在对用户而言重要的点上是精确的,但在对实现者而言重要的点上是模糊的.这样,用户就可以获得他能够编写程序所需的保证,但它也使实现者能够自由地将他的实现定制到他的特定利基.
例如,Java语言规范没有说垃圾收集.它仅定义何时何时可以访问对象,并定义您可以创建新对象.内存分配如何工作,垃圾收集器如何工作,是否是引用计数,跟踪或基于区域的收集器等等,所有这些都被忽略了,因此不同利基的不同实现可以使用不同的垃圾收集器实现并且相同利基的不同实现可以相互竞争.
或者,我是否必须创建一个类似的文档:
JMA必须提供方法:int jmaAdd(int x,int y)?
这也是一个规范.它甚至没有上面的那么有用.它确实定义了方法的名称,但没有定义它的作用.
int jmaAdd(int x, int y) { return x - y; }
是一个完全有效的实现该规范的实现
int jmaAdd(int x, int y) { return 0; }
同样,对于实施者来说,没有对用户的保证和过多的余地(或更确切地说:在错误的区域中留有余地).
或者,我是否必须创建接口并分发源代码?
public interface JMA{ int jmaAdd(int x,int y); }
我不一定称之为规范.这是代码,因此是一个实现.
注意:当然,在Java中,interface
s提供了随后实现的行为规范.但这不是术语规范的含义,就像你在问题中使用它一样.class
或者我是否必须编译接口并将其发布为jar?
同样,这是一个实现.
另外,规范是否可以包含抽象类或类?或者它必须只包含接口?
规范不包含任何内容.这是一张纸.
通常,规范是用英语编写的.实际上,它们是用专门的规范编写语言编写的,它通常是具有特定语义的高度风格化的英语正式子集.例如,BCP14/RFC2119:在RFC中用于表示需求级别的关键词定义了与IETF标准文档相关的一些常用英语单词的精确含义.(有趣的是,它也是一个规范,因此它成为编写规范的规范.)
有时也使用形式逻辑,特别是在编程语言规范中描述类型规则.有时,甚至使用专门的形式规范语言,如Z符号.
什么是规范,规范?
简单而不是非常令人满意的答案是规范是一种规范,如果它被关注规范的人称为规范.(或者更一般地说:想过作为规范.)
不同的社区对规范有不同的看法.并为他们命名.
例如,方案编程语言的原始规范只是在科学报告中发表.经过几轮改进和新报告后,他们发布了"关于算法语言方案的修订报告".之后是"修订后的算法语言计划修订报告".随之而来的是一种开玩笑,并且该语言的当前版本在"经修订的修订的修订的修订的修订的关于算法语言方案的修订报告"中定义,通常写成" 关于算法语言方案的修订的7报告".或者只是" R 7 RS ".
这些报告都不称为"规范",但每一个都是规范.在Scheme之前,ALGOL也使用了"Report"这个术语,其他几种语言也是如此.
Internet RFC也是一个很好的例子.从技术上讲,所有RFC都是"征求意见".这些RFC中只有极少数实际上升级到"标准"状态.有些也是"最佳实践".它们都不被称为"规范",但其中许多都被这样对待.例如,HTTP不是标准,但它被视为标准和规范,而我们新世界经济的重要部分就是基于此.
如果你想了解规格,那么你最好阅读一些:
Haskell 2010语言报告(另一个名为"报告"的例子)
Scala语言规范版本2.11
ECMA-262第6版,ECMAScript 2015语言规范
Java语言规范,Java SE 8版
Java虚拟机规范,Java SE 8 Edition
在HTTP规范,包括但不限于:
RFC7230:HTTP/1.1消息语法和路由
RFC7231:HTTP/1.1语义和内容
RFC7540:HTTP/2
RFC7541:HTTP/2的HPACK标头压缩
HTML生活标准(又名HTML5)
我认为这里的关键思想是"规范不包括实现".
当Sun是Java的管理员时,他们会编写Java EE和JPA等功能的规范,让其他供应商可以自由地实现.Sun通常会有自己的竞争实施,但他们的目标是销售硬件.鼓励其他供应商提供竞争性实施只会进一步推动这一目标.
Sun的规范既没有代码也没有JAR; 他们是关于代码如何工作的散文描述.
在Java领域,这些规范以Java规范请求(JSR)开头。
在这里定义:
https://jcp.org/en/jsr/overview
一旦被接受,这些就是规格。