我一直在Java或一段时间内使用注释作为最终用户,但最近我决定研究创建自己的注释类型,并且我发现使用@interface在Java中定义注释的语法非常奇怪.我的问题是为什么Java使用@interface来定义注释而不是像为枚举那样引入新的关键字?我缺少的@interface语法是否有一些优点?
我想要理解注释设计者经历的设计考虑因素我确信他们必须玩弄引入新关键字来定义注释的想法.
@interface有太多限制,例如你不能使用extend,在定义注释成员如Date时你不能使用特定的类型.我发现对@interface的限制并不明显,这对我来说就像是一个黑客.
我不知道这个特定案例的确切考虑因素,但总的来说:
将新关键字引入语言会破坏碰巧使用该特定关键字作为标识符的所有现有源代码的兼容性.
在更改现有源代码以避免使用关键字之前,不能使用新的编译器版本对其进行编译.这不是不可能克服的(如enum案例所示),但它很尴尬,迫使很多人做额外的工作.Java的设计者通常试图在不破坏源代码兼容性的情况下引入新的语言功能.
在enum您提到的情况下,我猜他们认为它是(a)其他C风格语言中的通用关键字,(b)通常仅用作现有代码中的本地范围标识符,因此易于重构(c)没有任何理智的选择.他们认为收益超过了成本.对于注释案例,他们显然是另有决定.
顺便说一句,您可能有兴趣观看Josh Bloch的有效API设计讲座,该讲座涉及很多这些考虑因素.
显然设计者并不想添加关键字。这不是你轻易做的事情,因为它会使现有的正确程序失效。Cobol-9x 委员会添加了数十个甚至数百个关键字,您应该已经听到了尖叫声。一些公司正在讨论起诉标准机构。