使用单个美元符号`$`作为java类名称的任何风险?

最初我使用下划线_作为类名。 新的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平台的语言使用,并且可能需要与您的代码共存。

目前,您可能不会遇到普通$ classname的技术问题(至少在标准Java工具链方面)。 但总有可能在未来发生变化:

  • 他们(有效地) 保留了改变这一点的权利 1
  • _示例中有一个先例可以做到这一点。

如果你真的需要一个单字符的类名,最好安全地使用它,并使用FZ或其他非保留的名称。

但说实话,我认为你最好尝试实现(或者只是使用)一种真正的函数式语言,而不是试图将function性编程“系统”转化为Java。 或者,也许只是在官方发布之前切换到Java 8。 “我会拒绝阅读/维护一个看起来像jquery的Java代码库。


我不是要为Java创建一个函数库,只是想创建一个lib来维护我使用的一些常用工具。 再一次,我是极简主义的倡导者,并对像apache commons这样的东西感到厌倦。 添加function的东西,以帮助我更容易操作集合。

如果是您的代码,您可以做自己喜欢的事情。 做出自己的决定。 根据你的意见行事。 成为“风险承担者”…… :-)。 (我们对$等的建议是没有意义的。)

但是,如果您是为客户或雇主编写此代码,或者打算创建(可行的)开源产品,那么您需要考虑其他人的意见。 例如,如果您在其他地方找到更好的工作,您的老板需要对您的代码的可维护性有一个明智的意见。 一般来说,下一个人是否能够弄明白,保留你的代码,新鲜等等……还是会被托付给垃圾箱?


1 – JLS§3.8声明“ $字符只能用于机械生成的源代码”。 这就是说“使用它会带来危险”。 假设构建自己的源代码生成器的人可以在标准工具链使用裸$ …时更改它们但是更改大量手写代码更难,这将是升级的障碍。

嗯,你是对的,在类名中使用$ 。 Eclipse抱怨它违反惯例,但是,如果你确定,你可以做到。

使用$的问题(传统上)是在类层次结构中使用$来指示嵌套类….例如,包含以下内容的文件A.java:

 class A { class SubA { } } 

将被编译为两个文件:

  1. 一类
  2. 一个$ SubA.class

这就是为什么,即使$有效,也是不明智的,因为解析jar子可能会更困难……而且你冒着碰撞两个类并导致其他问题的风险

编辑,我刚刚用以下两个Java文件进行了测试(在默认包中)

 public class A { private static final class SubA { public String toString() { return "I am initializing Nested SUBA"; } } private static final SubA sub = new SubA(); public A() { System.out.println("What is " + sub.toString()); } } public class A$SubA { @Override public String toString() { return "I am A$SubA"; } } public class MyMain { public static void main(String[] args) { System.out.println(new A()); System.out.println(new A$SubA()); } } 

并且代码不会编译…..

两个问题,类型A $ SubA已经定义,并且不能通过它的二进制名称引用嵌套类A $ SubA。

是的,要回答你的问题是迂腐有风险。 正如其他人提到的,它违反了java命名约定。 因此,风险在于JDK的未来版本可能会导致问题。 但除此之外,如果你尝试使用嵌套类,一些问题你应该没问题。

我想你是想避免像Util.andThen那样丑陋的名字。 考虑使用静态导入 。 这允许你导入标头import static org.ogsl.Util.*中的所有方法,这样你就可以简单地使用你而不用任何前缀。