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

23 java naming reserved-words

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

Rob*_*edy 38

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

  • 但艾拉,*改变*标识符.C#和Delphi方式*转义*原始名称,但它仍然是相同的名称.在Delphi中,您甚至可以编写没有转义字符的完全限定名称. (8认同)
  • 这在 Xml 或 JSON 序列化中尤其明显,因为序列化文本会将 ZZZ 作为标记名称的一部分 <ZZZstring></ZZZstring>,而在 C# 中,@string 将序列化为 <string></string>。 (3认同)

Sal*_*lty 28

不,没有办法.这就是他们被贴上"保留"标签的原因.

  • 在保留关键字前添加"_"就像"_new"一样,是您最接近的事情. (3认同)

sta*_*lue 11

大多数情况下,这个问题出现在"课堂"中,在这种情况下习惯上写"clazz".

  • 是否有所有关键字的最佳做法替代清单? (4认同)

Vla*_*dim 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");
    }

}
Run Code Online (Sandbox Code Playgroud)

此代码是一个格式良好且有效的Java类.但是,正如您所猜测的那样,有一个小技巧:"新"标识符中的"е"字符不属于ASCII字符集,它实际上是一个cyrrilic"е"(prounanced'YE').

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

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

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

  • 投票结果是因为这些伎俩会导致不容易理解的错误和行为.为什么不将它命名为'n3w'或其他任何名称,因为它旨在改变行为. (4认同)
  • @CodeMonkeyKing,遗憾的是并非所有人都不遵循最佳命名约定,并且完全有可能某人可能遇到一段代码,其中包含一个完全符合保留字的标识符,并且令人困惑,编译时没有错误.那么这个答案就会得到解决.此外,它正在回答被问到的实际问题."是否有人应该这样做是完全不同的事情." (3认同)
  • 如果我完全解析OP的问题,你建议的答案只是人眼看来是一个关键词而不是"使用Java保留字的棘手方法".我会从经验中说,这些是最难发现的错误.这个问题的真正答案是保留的关键字实际上是保留的. (3认同)
  • 我觉得这个答案值得"不要在家里(或在工作场所)尝试这个标签". (2认同)

bru*_*nde 6

不,你不能这样做.有关更多信息,请访问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
Run Code Online (Sandbox Code Playgroud)

  • 关于超级的耻辱 (2认同)