Java标识符中的"连接字符"是什么?

Luc*_*uke 206 java unicode scjp identifier

我正在阅读SCJP,我对这一行有疑问:

标识符必须以字母,货币字符($)或连接字符(如下划线(_))开头.标识符不能以数字开头!

它声明有效的标识符名称可以以连接字符(如下划线)开头.我认为下划线是唯一有效的选择吗?还有其他什么连接字符

Pet*_*rey 266

这是一个连接字符列表.这些是用于连接单词的字符.

http://www.fileformat.info/info/unicode/category/Pc/list.htm

U+005F _ LOW LINE
U+203F ? UNDERTIE
U+2040 ? CHARACTER TIE
U+2054 ? INVERTED UNDERTIE
U+FE33 ? PRESENTATION FORM FOR VERTICAL LOW LINE
U+FE34 ? PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
U+FE4D ? DASHED LOW LINE
U+FE4E ? CENTRELINE LOW LINE
U+FE4F ? WAVY LOW LINE
U+FF3F ? FULLWIDTH LOW LINE
Run Code Online (Sandbox Code Playgroud)

这在Java 7上编译.

int _, ?, ?, ?, ?, ?, ?, ?, ?, ?;
Run Code Online (Sandbox Code Playgroud)

一个例子.在这种情况下tp,列的名称和给定行的值.

Column<Double> ?tp? = table.getColumn("tp", double.class);

double tp = row.getDouble(?tp?);
Run Code Online (Sandbox Code Playgroud)

下列

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
    if (Character.isJavaIdentifierStart(i) && !Character.isAlphabetic(i))
        System.out.print((char) i + " ");
}
Run Code Online (Sandbox Code Playgroud)

版画

$ _¢¥¥؋৲৳૱฿฿₣₤₥₨₨₨₩₩₩₫₰₰₰₸₸₸₸₸₸﷼﷼﷼﷼﷼﹎﹎﹎ $ $ _¢£¥₩

  • 我期待有一天我继承了一些使用这些标识符的代码! (109认同)
  • @GrahamBorland怎么样`if(⁀‿⁀==⁀⁔⁀)`或`if($ == $)`或`if(¢+¢==₡)`或`if(B + _!=฿) ` (82认同)
  • @MarkoTopolnik小心你的意愿.;) (58认同)
  • 我可能会将其中的一两个投入到我的代码中,只是为了踢!并测试构建系统是否真的符合UTF-8标准. (17认同)
  • 顺便说一句您也可以使用任何货币符号.`int৲,¤,₪₪₪₪;`:D (3认同)
  • (⁀⁀)我对此感到有点不舒服 (3认同)
  • @FredOverflow这是德拉克马货币符号.没有一个国家使用它,但如果最坏的情况发生在欧洲,它可能会回来.http://en.wikipedia.org/wiki/Greek_drachma (3认同)
  • 这个问题和这个答案充满了胜利.我现在可以制作Zoidberg变量..¤¤¤ (2认同)
  • 尝试检查`isJavaIdentifierPart`而不是`isJavaIdentifierStart`.这更有趣! (2认同)

Mar*_*nen 25

遍历整个65k字符并询问Character.isJavaIdentifierStart(c).答案是:"承诺"小数8255

  • 我无法抗拒(在Scala中):`(1到65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size` - 产生48529个字符...... (14认同)
  • 总计数= 90648,但我要去'Character.MAX_CODE_POINT`,这可能超过'2 << 16`. (3认同)

Gre*_*ill 7

可以在Java语言规范中找到合法Java标识符的权威规范.

  • 我不确定实际上完全回答了哪些字符可能启动Java标识符的(暗示)问题.以下链接我们最终在[Character.isJavaIdentifierStart()](http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Character.html#isJavaIdentifierStart%28char%29)中说明*当且仅当下列条件之一为真时,字符才可以启动Java标识符:... ch是货币符号(**如**"$"); ch是一个连接标点字符(**如**"_").* (3认同)
  • @GregHewgill这是愚蠢的,考虑到其他一切都是如此紧密.我认为这些是实际的Unicode字符类,它们在Unicode标准中定义(在其他地方?).isJavaIdentifierStart()提到getType(),货币符号和连接符标点符号也是该函数可以返回的类型,因此可以在那里给出列表."常规类别"实际上是Unicode标准中的特定术语.因此有效值将是"L"[全部],"Nl","Sc","Pc". (3认同)
  • @GregHewgill是对的.规范简短明了,由Character.isJavaIdentifierStart()和Character.isJavaIdentifierPart()定义.结束.要记住的关键是Unicode正在发展; 不要陷入思考字符集的陷阱(拉丁语是一个可怕的例子;忽略它).字符始终创建.问你的日本朋友.期望合法的java标识符随着时间的推移而改变 - 这是有意的.关键是让人们用人类语言编写代码.这导致了允许变更的硬性要求. (3认同)

Sim*_*ant 6

这是 Unicode中的连接器字符列表.您将无法在键盘上找到它们.

U + 005F LOW LINE _
U + 203FUNDERTIE‿U
+ 2040 CHARACTERTIE⁀U
+ 2054倒立⁔U
+ FE33垂直低线
演示形式_ U + FE34垂直低频线演示形式
︴U + FE4D DASHED LOW LINE ﹍
U + FE4E中心线低线﹎
U + FE4F WAVY低线﹏
U + FF3F FULLWIDTH低线_

  • 我不知道你正在使用什么键盘布局,但我当然可以轻松输入_(U + 005F):) (5认同)