保留字作为名称或标识符

时间:2009-01-08 11:47:46

标签: java naming reserved-words

使用Java保留字作为变量,方法,类,接口,包或枚举常量名称是否有任何棘手的方法?

14 个答案:

答案 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)

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

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的字段,用于指示文档是否已作废。