Estou lendo para o SCJP e tenho uma pergunta sobre esta linha:
Os identificadores devem começar com uma letra, um caractere de moeda ($) ou um caractere de conexão, como o sublinhado (_). Os identificadores não podem começar com um número!
Ele afirma que um nome de identificador válido pode começar com um caractere de conexão , como sublinhado. Eu pensei que sublinhados eram a única opção válida? Quais outros caracteres de conexão existem?
java
unicode
identifier
scjp
LuckyLuke
fonte
fonte
_
é um identificador "obsoleto". Especificamente, o compilador emite o seguinte aviso: (o uso de '_' como um identificador pode não ser suportado em releases após o Java SE 8) ._
para uso em recursos de idiomas futuros . Os identificadores que começam com um sublinhado ainda estão ok, mas um único sublinhado é um erro se usado como um nome de parâmetro lambda e um aviso em qualquer outro lugar.. ; [ / < > :
é: stackoverflow.com/questions/26791204/… docs.oracle.com/javase/specs/jvms/se7/html/… Todo o resto é uma restrição apenas para Java._, _ -> doSomething();
.Respostas:
Aqui está uma lista de caracteres de conexão. Esses são caracteres usados para conectar palavras.
http://www.fileformat.info/info/unicode/category/Pc/list.htm
Isso compila no Java 7.
Um exemplo. Nesse caso,
tp
é o nome de uma coluna e o valor para uma determinada linha.Os seguintes
impressões
$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ৻ ‿ ⁀ ₠ ₡ ₢ ₣ ₤ ₥ ₧ ₧ ₨ ₪ ₫ ₫ ₫ ₫ ₫ € ₭ ₮ ₱ ₱ ₱ ₱ ₱ ₱ ₱ ₱ ₱ ₱ ₱ ₱ ₱ ₱ ₫ ₫ ₫ ﹩ $ _ ¢ £ ¥ ₩
fonte
int ৲, ¤, ₪₪₪₪;
: Dif( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀)
ouif ($ == $)
ouif (¢ + ¢== ₡)
ouif (B + ︳!= ฿)
itere através dos caracteres de 65k e pergunte
Character.isJavaIdentifierStart(c)
. A resposta é: decimal "undertie" 8255fonte
(1 to 65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size
- produz 48529 caracteres ...Character.MAX_CODE_POINT
, o que provavelmente é mais do que2<<16
.A especificação definitiva de um identificador Java legal pode ser encontrada em Java Language Specification .
fonte
L
[todos],Nl
,Sc
,Pc
.Aqui está uma lista de caracteres do conector em Unicode. Você não os encontrará no teclado.
U + 005F linha baixa _
U + 203F UNDERTIE ‿
U + 2040 PERSONAGEM TIE ⁀
U + 2054 INVERTIDO UNDERTIE ⁔
U + FE33 APRESENTAÇÃO FORMULÁRIO PARA VERTICAL linha baixa _ L
+ FE34 APRESENTAÇÃO FORMULÁRIO PARA VERTICAL WAVY linha baixa ︴
U + FE4D tracejada linha baixa ﹍
LINHA BAIXA CENTRAL
U + FE4E LINE LINHA BAIXA ONDULADA
U + FE4F ﹏ LINHA BAIXA LARGA LARGA U + FF3F _
fonte
Um caractere de conexão é usado para conectar dois caracteres.
Em Java, um caractere de conexão é aquele para o qual Character.getType (int codePoint) / Character.getType (char ch) retorna um valor igual a Character.CONNECTOR_PUNCTUATION .
Observe que em Java, as informações de caracteres são baseadas no padrão Unicode, que identifica os caracteres de conexão, atribuindo a eles a categoria geral Pc, que é um alias para Connector_Punctuation .
O seguinte snippet de código,
imprime os caracteres de conexão que podem ser usados para iniciar um identificador no jdk1.6.0_45
O seguinte compila em jdk1.6.0_45,
Aparentemente, a declaração acima falha ao compilar no jdk1.7.0_80 & jdk1.8.0_51 para os dois caracteres de conexão a seguir (compatibilidade com versões anteriores ... oops !!!),
Enfim, detalhes à parte, o exame se concentra apenas no conjunto de caracteres latinos básicos .
Além disso, para identificadores legais em Java, a especificação é fornecida aqui . Use as APIs da classe Character para obter mais detalhes.
fonte
Um dos caracteres mais divertidos permitidos nos identificadores Java (mas não no início) é o caractere unicode chamado "Zero Width Non Joiner" (& zwnj ;, U + 200C, https://en.wikipedia.org / wiki / Zero-width_non-joiner ).
Eu tive isso uma vez em um pedaço de XML dentro de um valor de atributo, mantendo uma referência a outro pedaço desse XML. Como o ZWNJ tem "largura zero", ele não pode ser visto (exceto ao andar junto com o cursor, ele é exibido logo no caractere anterior). Também não pôde ser visto no arquivo de log e / ou na saída do console. Mas ele estava lá o tempo todo: copiar e colar nos campos de pesquisa conseguiu e, portanto, não encontrou a posição referida. Digitar a parte (visível da cadeia) no campo de pesquisa, no entanto, encontrou a posição referida. Levei um tempo para descobrir isso.
Digitar um não-marceneiro com largura zero é realmente muito fácil (muito fácil) ao usar o layout de teclado europeu, pelo menos em sua variante alemã, por exemplo, "Europatastatur 2.02" - é acessível com AltGr + ".", Duas teclas que infelizmente, estão localizados um ao lado do outro na maioria dos teclados e podem ser facilmente atingidos acidentalmente.
Voltando ao Java: pensei bem, você poderia escrever um código como este:
com o segundo anexado por um marceneiro de largura zero (não é possível fazer isso no código acima, capturado no editor do stackoverflow), mas isso não funcionou. O IntelliJ (16.3.3) não reclamou, mas o JavaC (Java 8) reclamou de um identificador já definido - parece que o JavaC realmente permite o caractere ZWNJ como parte de um identificador, mas ao usar a reflexão para ver o que faz, o ZWNJ O caractere é retirado do identificador - algo que caracteres como ‿ não são.
fonte
A lista de caracteres que você pode usar dentro de seus identificadores (e não apenas no início) é muito mais divertida:
A lista é:
Inclui a maioria dos caracteres de controle! Quero dizer sinos e merda! Você pode fazer seu código fonte tocar a campainha fn! Ou use caracteres que serão exibidos apenas algumas vezes, como o hífen suave.
fonte