题
使用Java保留字作为变量,方法,类,接口,包或枚举常量名称是否有任何棘手的方法?
解决方案
不,没有办法。这就是为什么他们被标记为“保留”的原因。
其他提示
这是一个有效的问题。 这样的东西可能在其他语言中。在C#中,使用 @
(按照之前的要求);在Delphi中,前缀为&
。但Java没有提供这样的功能(部分原因是它并不需要像.Net世界那样与其他语言定义的标识符进行交互)。
大多数情况下,这个问题出现在“类”中,在这种情况下,习惯上写“clazz”。
严格来说,除非你得到一个不符合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来命名标识符,这一点非常重要。这意味着,如果他们愿意,可以用法语,中文或俄语自由地打电话给她或他的班级。也可以在代码中混合和匹配字母表。从历史上看,拉丁语和其他字母表中的一些字母是相似的。
结果:不,您不能将保留字用作标识符,但您可以使用看起来与保留字完全相同的标识符。
是否有人应该这样做是完全不同的事情。
不,你不能这样做。欲了解更多信息,请访问 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
是的,有。 您必须使用未来的保留字。 就像在1.4之前的代码中称为assert()的不同方法所发生的那样。
希望它有所帮助!
咦?你为什么想这么做?你可以用l33t编写它们,这会欺骗编译器。
class cl4ss {
String r3turn() {
return "but why?";
}
}
我知道这个问题仍然存在,可能对某人有帮助。
可以使用GSON的现场命名支持
例如
@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 编译器中使用保留字。
从技术上讲,你可以在编译后编辑类文件中的名称成为你想要的任何东西:在那个阶段,虚拟机并不关心,因为它不再处理源代码了。我相信一些混淆器使用这种技术。
IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF
正如其他人在此处所指出的,执行此操作的能力不是建议。
Java设计者决定语言中的关键字数量是适度的,并保留了该集合。他们甚至保留了'GOTO',这在任何真正的Java程序中都不允许。
不确定你要做什么,但$是标识符中的有效字符,所以你可以这么做,比如说:
int $ return = 5;
看起来有点奇怪,但确实有效。
在Scala中,您可以使用反引号。例如:myVarialbe .class`
如果您确实需要使用与保留字相同的字段/局部变量/方法,我建议在名称的末尾添加下划线:
// JPA entity mapping class:
private Boolean void_;
public Boolean getVoid_() { ... }
void setVoid_(Boolean void_) { ... }
比在名称的开头附加字符(fVoid,aVoid,vVoid等)更具可读性(IMHO)
上面的代码是发生在我身上的一个真实案例,使用遗留数据库,其中 invoice
表有一个名为 void
的字段,指示文档是否已经无效了。