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