有没有什么技巧可以将 Java 保留字用作变量、方法、类、接口、包或枚举常量名?
13 回答
这是一个有效的问题。这样的事情在其他语言中是可能的。在 C# 中,在标识符前面加上@
(如前所述); 在 Delphi 中,前缀为&
. 但是 Java 没有提供这样的功能(部分原因是它不需要像 .Net 世界那样与其他语言定义的标识符进行交互)。
不,没有办法。这就是为什么他们被贴上“保留”的标签。
大多数情况下,这个问题出现在“class”上,在这种情况下,习惯上写成“clazz”。
不,你不能这样做。如需更多信息,请参阅JLS 第 3.8、3.9 节
以下由 ASCII 字母组成的字符序列保留用作关键字,不能用作标识符(第 3.8 节):
Keyword: one of abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
严格来说你不能,除非你得到一个不符合 Java 语言规范的有缺陷的编译器实现。
但有志者事竟成。将以下代码复制到您的 IDE 中,将源文件编码切换为 UTF-16,然后我们开始:
public class HelloWorld {
public static void main(String[] args) {
HelloWorld.nеw();
}
public static void nеw () {
System.out.println("Hello,World");
}
}
此代码是格式良好且有效的 Java 类。然而,正如你猜到的,有一个小技巧:“new”标识符中的 'е' 字符不属于 ASCII 字符集,它实际上是一个西里尔字母 'е'(发音为 'YE')。
当前的 Java 语言规范明确允许使用 Unicode 来命名标识符,而这一点很重要。这意味着如果他们愿意,一个人可以自由地用法语、中文或俄语给她或他的班级打电话。也可以在代码中混合和匹配字母。从历史上看,拉丁字母和其他字母中的一些字母是相似的。
结果:不,您不能使用保留字作为标识符,但您可以使用看起来与保留字完全一样的标识符。
是否有人应该这样做是完全不同的事情。
就在这里。您必须使用将来的保留字。就像在 1.4 之前的代码中调用 assert() 的不同方法所发生的一样。
希望能帮助到你!
不确定您要做什么,但 $ 是标识符中的有效字符,因此您可以这样做:
int $return = 5;
它看起来有点奇怪,但它确实有效。
在 Scala 中,您可以使用反引号。例如:myVarialbe.`class`
我知道这仍然是个老问题,可能会对某人有所帮助。
可以使用 GSON 的字段命名支持
例如。
@SerializedName("new")
private String New;
public String getNew ()
{
return New;
}
public void setNew (String aNew)
{
New = aNew;
}
嗯?你为什么想这么做?你可以用 l33t 编写它们,这会欺骗编译器。
class cl4ss {
String r3turn() {
return "but why?";
}
}
javac编译器无法使用保留字。
从技术上讲,一旦将类文件编译为您想要的任何名称,您就可以在其中编辑名称:在那个阶段,VM 不在乎,因为它不再处理源代码。我相信一些混淆器使用这种技术。
PL/1(一种 1960 年代的 IBM 大型机编程语言至今仍在使用)相当有名地要求虽然某些词在某些上下文中充当关键字,但所有词都可以用作标识符。如果您开始保持一致,这在解析器中甚至不难做到。PL/1 被认为是一种相当大的语言,语言委员会担心许多程序员不会全部学习,然后当他们尝试使用他们不知道的部分的关键字作为标识符时会感到惊讶. 所以你可以写这样的东西:
IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF
正如其他人在这里指出的那样,不建议这样做。
Java 设计者认为语言中的关键字数量不多,并保留了该集合。他们甚至保留了“GOTO”,这实际上在任何真正的 Java 程序中都是不允许的。
如果您确实需要使用与保留字名称相同的字段/局部变量/方法,我建议在名称末尾附加下划线:
// JPA entity mapping class:
private Boolean void_;
public Boolean getVoid_() { ... }
void setVoid_(Boolean void_) { ... }
它比在名称开头附加字符(fVoid、aVoid、vVoid 等)更具可读性(恕我直言)
上面的代码是发生在我身上的真实案例,使用的是遗留数据库,其中invoice
表有一个名为的字段void
,指示文档是否已作废。