当前位置: 首页 > 面试题库 >

使用单个美元符号“ $”作为Java类名称会有任何风险吗?

冯阳成
2023-03-14
问题内容

最初,我使用下划线_作为类名。新的Java8编译器抱怨它“ 在Java SE 8之后可能不受支持
”。我将其更改为$,不再有警告。但是我记得$Java使用它在字节码中指示一个内部/嵌入式类。我想知道使用美元符号$作为类名是否有任何风险

这个问题的一些背景。我想做的是克服Java不支持纯函数的事实,而_或$是放置一个命名空间来封装一些非常通用的概念(类/静态方法)。我对此也没有好名,也不想让lib用户键入太多东西来引用该命名空间。这是显示我正在执行的操作的代码:https :
//github.com/greenlaw110/java-
tool/blob/master/src/main/java/org/osgl/_.java


问题答案:

这是不好的样式,$在Java中的任何标识符中使用都有潜在的风险。冒险的原因是该$字符保留供Java工具链和第三方语言工具使用。

  • Java编译器在内部和嵌套类的“内部”类名称中使用它。
  • Java编译器以合成属性的名称使用它。
  • 第三方代码生成器(例如,注释处理器)可以将其用于各种目的。
  • 面向JVM平台的其他语言也可以使用它,并且可能需要与您的代码共存。

目前,您可能没有普通$类名的技术问题(至少在标准Java工具链方面)。但是总有可能在将来改变这种情况:

  • 他们(有效地) 保留 更改此 权利 1。
  • _示例中有这样做的先例。

如果确实需要一个字符的类名,最好安全地使用它或使用FZ保留一些其他名称。

但老实说,我认为您最好尝试实现(或仅使用)一种真正的功能语言,而不是尝试将功能编程“系统”引入Java。或者,也许可以在正式发布之前切换到Java
8。Cos I 拒绝 阅读/维护看起来像jquery的Java代码库。

我并不是要为Java创建功能库,而只是想创建一个库来维护我使用的一些通用实用程序。同样,我是极简主义者的拥护者,并且对apache
commons之类的东西感到厌倦。添加了功能性内容以帮助我更轻松地操作集合。

如果这是您的代码,则可以执行所需的操作。自己做决定。根据您的意见采取行动。成为“冒险者” … :-)。(我们对$等的建议尚无定论。)

但是,如果您正在为客户或雇主编写此代码,或者打算创建(可行的)开源产品,那么您需要考虑其他人的意见。例如,如果您在其他地方找到一份薪水更高的工作,您的老板需要就代码的可维护性有一个知情的意见。通常,下一个家伙将能够弄清楚它,保留您的代码,更新等…还是将其委托给垃圾箱?

1-
JLS§3.8指出“
$字符只能在机械生成的源代码中使用”。那就是说“使用它的后果自负”。假设是,如果标准工具链只使用裸机,则构建自己的源代码生成器的人可以 更改
它们$,但是更改许多手写代码比较困难,这将是升级的障碍。



 类似资料:
  • 问题内容: 我正在使用每个PHP的YouTube数据API,并要求特定用户使用json格式的视频供稿。json_decode之后的结果如下(简化示例): 我的问题是:如何使用PHP访问例如“ xmlns $ media”节点?在美元符号内,它不起作用,或者有没有一种我还没有得到的方法? 问题答案: 这将起作用: 或者,您可以告诉您返回一个数组:

  • 我试图使使用该类注册的任何元块中的子块只需要一个类来命名,也就是说,将它们命名为参数值,但不使用参数值。 虽然这是围绕一个API(Minecraft Forge)展开的,但我认为这是一个Java问题,所以我在这里快速解释一下我打算做什么。 元块由子块组成,子块是同一块的变体(例如,同一块,但仅纹理和名称发生变化)。每个子块都需要一个名称来标识它。这些名称以的形式列在类中,然后以(例如:,,等等),

  • 问题内容: 我指的是我以前的问题,但是这次我使用了Java编译器,编译器对输出进行了编译-它给出了一个奇怪的输出。这次我用代替。 这是程序的代码。 您认为这里的问题是什么?这是Java中的错误吗? Java版本-1.6.0 JDK 我使用Eclipse运行该程序,但有一个“找不到类”异常。 是文件名…我们做了较小的编辑,并命名了一个公共类,但结果相同。我们进一步发现问题出在编译器上。 问题答案:

  • 家长和孩子通过Angular.io官方指南中的服务示例进行交流。io在可观察的流名称中使用美元符号。 注意<代码> missionAnnounced $ < /代码>和<代码> mi 有人能解释一下吗: < li >为什么使用< code>$?这个符号背后的原因是什么?我总是需要对公共属性使用这个吗? < li >使用公共属性,但不使用方法(例如missionAnnouncements()、mis

  • 问题内容: 美元符号($)是用于命名变量的有效字符,例如,但是当我们谈论命名约定时,何时应使用该符号? 例如,下划线最常用于分隔单词,因为不允许使用空格。 问题答案: 从Java语言规范中的标识符开始: 该字符应仅在机械生成的源代码中使用,或很少用于访问旧系统上的现有名称。

  • 问题内容: 我定义了以下Java类: 当我尝试编译它们时,出现以下错误: 如果我删除文件并从所有文件中编译: 因此Java允许我定义一个名称中包含美元符号的类。如何编译我的原始示例? 问题答案: 之所以会发生名称冲突,是因为您定义的顶级类A $ B与类A的静态内部类B的生成名称具有相同的名称。由于两者都存在,因此编译器无法解决冲突。 JLS说: $字符仅应在机械生成的源代码中使用,或很少用于访问旧