The Java Persistence API (JPA) is a Java application programming
interface specification…
要么
JavaServer Faces (JSF) is a Java specification…
但我不知道我是否明白什么是一个规范.
让我说我创建一个新的规范JMA,Java Math API,它是一个Java数学规范..
是否足够我定义我的规范如下:
JMA must provide a method that adds two integers?
或者,我必须创建一个文件:
JMA must provide the method: int jmaAdd(int x,int y)?
或者,是否必须创建接口并分发源代码?
public interface JMA{ int jmaAdd(int x,int y); }
或者我必须编译接口并将其发布为jar?
另外,规范可以包含抽象类还是类?还是只能由接口组成?
什么是规范,规范?
解决方法
Is it enough that I define my specification as follows:
JMA must provide a method that adds two integers?
这是一个规范.
这不是一个非常有用的一个,因为它不给予用户该规范实现的许多保证.如果我想编写一个添加两个整数的程序,我只能从阅读规范中做到这一点.
尽管如此,它确实给予了实施者很多的自由.一般来说,您希望您的规范在对用户重要的位置上是精确的,但对于与实施者相关的要点则是模糊的.这样一来,用户获得了他能够编写程序所需的保证,同时也使实现者可以自由地将他的实现定制到他的特定利基.
例如,Java语言规范对垃圾收集没有任何意义.它只定义何时对象是可访问的,并且它定义了可以创建新对象.内存分配如何工作,垃圾收集器的工作原理,无论是引用计数,跟踪还是基于区域的收集器等等,所有这些都被忽略,因此不同的利基的不同实现可以使用不同的垃圾收集器实现,同一个利基的不同实现可以相互竞争.
or,do I have to create a document something like:
JMA must provide the method: int jmaAdd(int x,int y)?
这也是一个规范.它甚至比上面那些有用.它定义了方法的名称,但它没有定义它的作用.
int jmaAdd(int x,int y) { return x - y; }是一个非常有效的规范实现
int jmaAdd(int x,int y) { return 0; }再次,对于实施者来说,用户不能保证和太多的余地(或更准确地说,在错误的区域中的余地).
or,do I have to create the interfaces and distrubute the source code?
06002
我不一定会称该规范.这是代码,因此是一个实现.
注意:当然,在Java中,接口提供了类实现的行为规范.但是,这不是术语规范在您的问题中使用它的方式的意思.
or do I have to compile the interfaces and publish it as jar?
再次,这是一个实现.
Also,can a specification contain abstract classes or classes at all? Or must it consist only of interfaces?
规格不包含任何内容.这是一张纸.
通常,规格是用英文写的.那么实际上,它们是用专门的规范写作语言编写的,这种语言通常是具有特定语义的英语的高度程式化的正式子集.例如,BCP14/RFC2119: Key words for use in RFCs to Indicate Requirement Levels定义了与IETF标准文件相关的一些常用英语单词的确切含义. (有趣的是,它也是一个规范,因此使其成为编写规范的规范.)
有时还使用正式逻辑,特别是在编程语言规范中描述输入规则.有时甚至使用专门的正式规范语言,如Z Notation.
What makes a specification,a specification?
简单且不令人满意的答案是,规范是规范,如果被关心规范的人称为规范. (或更一般地说:作为一个规范).
不同的社区对规格有不同的看法.和他们不同的名字.
例如,scheme编程语言的原始规范只是在科学报告中公布.经过几轮的改进和新的报道,他们出版了“修订的算法语言计划报告”.之后是“修订的算法语言计划修订报告”.随之而来的是一种开玩笑的语言,而现行的语言版本则是在“修订的经修订的经修订的经修订的经修订的算法语言计划修订报告”中定义的,通常写成“修订的关于算法语言计划的7个报告”或只是“R7RS”.
这些报告都不被称为“规范”,但每一个都是一个规范.在计划之前,ALGOL还使用了“报告”一词,和其他几种语言一样.
互联网RFC也是一个很好的例子.从技术上讲,所有RFC都是“请求注释”.只有极少数的RFC实际上提升到“标准”状态.有些也是“最佳实践”.他们都不称为“规范”,但其中许多都是这样对待的.例如,HTTP不是一个标准,而是被视为一个标准和一个规范,而我们新的世界经济的重要部分是建立在这一点上的.
如果您想了解规格,最好只要阅读一些:
> Haskell 2010 Language Report(另一个名称为“报告”)
> Scala Language Specification Version 2.11
> ECMA-262 6th Edition,The ECMAScript 2015 Language Specification
> The Java Language Specification,Java SE 8 Edition
> The Java Virtual Machine Specification,Java SE 8 Edition
> HTTP Specifications,包括但不限于> RFC7230: HTTP/1.1 Message Syntax and Routing
> RFC7231: HTTP/1.1 Semantics and Content
> RFC7540: HTTP/2
> RFC7541: HPACK Header Compression for HTTP/2