保留字作为变量或方法名称

是否有任何使用Java保留字作为变量或方法名称的棘手方法?

不,没有办法。 这就是为什么他们被标记为“保留”。

这是一个有效的问题。 这种事情在其他语言中可能的。 在C#中,使用@前缀标识符( 如前所述 ); 在Delphi中,前缀为& 。 但Java没有提供这样的function(部分原因是它并不真正需要像.Net世界那样与其他语言定义的标识符进行交互)。

大多数情况下,这个问题出现在“阶级”中,在这种情况下习惯上写“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类。 但是,正如您所猜测的那样,有一个小技巧:“新”标识符中的“е”字符不属于ASCII字符集,它实际上是一个cyrrilic“е”(prounanced’YE’)。

当前的Java语言规范明确允许使用Unicode来命名标识符,这一点非常重要。 这意味着,如果他们愿意,可以用法语,中文或俄语自由地打电话给她或他的class级。 也可以在代码中混合和匹配字母表。 从历史上看,拉丁文和其他字母表中的一些字母是相似的。

因此:不,您不能将保留字用作标识符,但您可以使用看起来与保留字完全相同的标识符。

是否有人应该这样做是完全不同的事情。

就在这里。 你必须使用未来的保留字。 就像前1.4代码中称为assert()的不同方法所发生的一样。

希望能帮助到你!

咦? 你为什么想这么做? 你可以用l33t编写它们,这会欺骗编译器。

 class cl4ss { String r3turn() { return "but why?"; } } 

我知道这个问题仍然存在,可能对某人有所帮助。

使用GSON的Field Naming支持是可能的

例如。

 @SerializedName("new") private String New; public String getNew () { return New; } public void setNew (String aNew) { New = aNew; } 

一些区分大小写的语言允许以下内容:

 class New; class Something { New makeNew() { return new New(); } } 

但是为什么你想要能够像这样编写一行代码:

 class new; class Something { bool if; new makeNew() { return if ? new new() : null; } } 

只需看看语法高亮。 即使它感到困惑!

无法在javac编译器中使用保留字。

从技术上讲, 一旦编译成你想要的任何东西,就可以编辑类文件中的名称 :在那个阶段,VM不关心,因为它不再处理源代码。 我相信一些混淆器使用这种技术。

PL / 1(1960年代的IBM大型机编程语言仍然存在)相当着名的要求,虽然某些词在某些上下文中就像关键词一样,但所有词都可以用作标识符。 如果您打算对它进行一致,那么在解析器中甚至难以做到这一点。 PL / 1被认为是一个相当大的语言,语言委员会担心许多程序员不会学习所有这些语言,然后当他们尝试使用他们不知道的标识符作为标识符的关键字时会感到惊讶。 所以你可以这样写:

 IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF 

正如其他人在此处所指出的,这样做的能力不是推荐。

Java设计者决定langauge中的关键字数量是适度的,并保留了该集合。 他们甚至保留了’GOTO’,这在任何真正的Java程序中实际上都不允许。

不确定你要做什么,但$是标识符中的有效字符,所以你可以这样做,比如说:

int $return = 5;

它看起来有点奇怪,但确实有效。

在Scala中,您可以使用反引号。 例如:myVarialbe .class`