Java tanımlayıcılarında “bağlantı karakterleri” nedir?


208

SCJP için okuyorum ve bu satırla ilgili bir sorum var:

Tanımlayıcılar bir harf, para birimi karakteri ($) veya alt çizgi (_) gibi bir bağlantı karakteriyle başlamalıdır. Tanımlayıcılar bir sayı ile başlayamaz!

Geçerli bir tanımlayıcı adının alt çizgi gibi bir bağlantı karakteriyle başlayabileceğini belirtir . Alt çizgilerin tek geçerli seçenek olduğunu düşündüm. Başka hangi bağlantılı karakterler var?


2
"Bir para birimi karakteri" ile ilgili olarak: Bu soruyu İngiltere ziyaretçileri şaşırtabilir ve "a" para birimi karakteriyle başlayabilmeye uygun olarak Java tanımlayıcılarının yasal olarak pound simgesiyle (£) başlayabileceğini bilmek isteyebilir.
8bitjunkie

11
Java 8'den beri _"kullanımdan kaldırılmış" bir tanımlayıcı olduğunu unutmayın. Özellikle, derleyici aşağıdaki uyarıyı verir: (bir tanımlayıcı olarak '_' kullanımı Java SE 8'den sonraki sürümlerde desteklenmeyebilir) .
aioobe

4
@aioobe Yup. Brian Goetz _gelecekteki dil özelliklerinde kullanmak için "geri talep ettiklerini" söylüyor . Alt çizgi ile başlayan tanımlayıcılar hala iyidir, ancak tek bir alt çizgi lambda parametre adı olarak kullanılırsa bir hata ve başka her yerde bir uyarıdır.
Mart'ta Boann

1
Bayt kodu için, içermeyen diziye göre her şey . ; [ / < > :gider: stackoverflow.com/questions/26791204/… docs.oracle.com/javase/specs/jvms/se7/html/… Diğer her şey yalnızca Java'ya özgü bir kısıtlamadır.
Ciro Santilli 法轮功 at 病 六四 事件 法轮功

@Boann Komik olan şey, lambdalarda kullanımına izin vermemeleri, ancak muhtemelen, örneğin lambdalarda kullanılacak bir "bu argümanı yoksay" tanımlayıcısı olarak geri gelecektir. Sadece bu gibi kullanmaya çalıştı: _, _ -> doSomething();.
user31389

Yanıtlar:


268

Bağlantı karakterlerinin listesi. Bunlar kelimeleri bağlamak için kullanılan karakterlerdir.

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

Bu, Java 7'de derlenir.

int _, ‿, ⁀, ⁔, ︳, ︴, ﹍, ﹎, ﹏, _;

Bir örnek. Bu durumda tp, bir sütunun adı ve belirli bir satırın değeridir.

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

double tp = row.getDouble(︴tp︴);

Devamındaki

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 + " ");
}

baskılar

$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ৻ ૱ ฿ ៛ ‿ ⁀ ⁔ ₴ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₫ ₭ ₮ ︴ ﹍ ﹍ ﹎ ﹏ ﹏ ﹏ ﹏ ₷ ₷ ﹏ ﹩ $ _ ¢ £ ¥ ₩


109
Ben bu tanımlayıcıları kullanan bazı kod devralmak gün bekliyorum!
Marko Topolnik

58
@MarkoTopolnik Ne istediğinize dikkat edin. ;)
Peter Lawrey

3
BTW Para birimi simgelerinden herhangi birini de kullanabilirsiniz. int ৲, ¤, ₪₪₪₪;: D
Peter Lawrey

17
Bunlardan bir ya da iki tanesini koduma atabilirim, sadece tekmeler için! Ve derleme sisteminin gerçekten UTF-8 uyumlu olup olmadığını test etmek .
Marko Topolnik

82
@GrahamBorland Peki ya if( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀) da if ($ == $)ya if (¢ + ¢== ₡)daif (B + ︳!= ฿)
Peter Lawrey

25

tüm 65k karakterleri tekrarlayın ve isteyin Character.isJavaIdentifierStart(c). Cevap: "alt" ondalık 8255


14
(1 to 65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size
Direnemedim

65k ve 12k ve 8.5k gibi birkaç karakter var gibi görünüyor
Markus Mikkolainen

"! isLetter" ve "! isDigit" derseniz vermez
Markus Mikkolainen

2546 + 2547 en az "kutu çizimi ..."
Markus Mikkolainen

3
Toplam sayı = 90648, ama gidiyorum Character.MAX_CODE_POINT, muhtemelen daha fazla 2<<16.
Martijn Courteaux

7

Yasal bir Java tanımlayıcısının kesin belirtimi Java Dil Belirtimi'nde bulunabilir .


3
Aslında hangi karakterlerin bir Java tanımlayıcısını başlatabileceği (zımni) sorusuna tam olarak cevap verdiğinden emin değilim. Biz de sonuna kadar bağlantıları takip Character.isJavaIdentifierStart () devletler ve aşağıdaki koşullardan yalnızca birinin doğru olması durumunda bir Java tanımlayıcı başlayabilir Bir karakter: ... ch (bir para birimi simgesi olan gibi "$"); ch (bir bağlantı noktalama işareti gibi "_").
CVn

1
Spesifikasyon, kabul edilebilir karakterlerin son listesini uygulamaya kadar bırakır, böylece herkes için potansiyel olarak farklı olabilir.
Greg Hewgill

3
@GregHewgill Diğer her şeyin ne kadar sıkı belirtildiğini düşünürsek, bu aptalca olur. Bunlar Unicode standardında (başka nerede?) Tanımlanan gerçek Unicode karakter sınıfları olduğunu düşünüyorum. isJavaIdentifierStart () ifadesi getType () 'dan bahseder ve para birimi simgesi ve bağlayıcı noktalama işaretleri de bu işlev tarafından döndürülebilecek türlerdir, bu nedenle listeler orada verilebilir. "Genel kategori" aslında Unicode standardında belirli bir terimdir. Geçerli değerler olacaktır Yani L[hepsi], Nl, Sc, Pc.
Random832

3
@GregHewgill doğru. Spesifikasyon kısa ve nettir ve Character.isJavaIdentifierStart () ve Character.isJavaIdentifierPart () tarafından tanımlanır. Son. Hatırlanması gereken en önemli şey Unicode'un evrimleşmekte olduğudur; karakter setlerini bitmiş olarak düşünme tuzağına düşmeyin (Latince korkunç bir örnektir; görmezden gelin). Karakterler her zaman oluşturulur. Japon arkadaşlarınıza sorun. Yasal java tanımlayıcılarının zaman içinde değişmesini bekleyin - bu kasıtlıdır. Mesele insanların dillerinde kod yazmalarına izin vermektir. Bu, değişime izin vermek için zor bir gereksinime yol açar.
James Moore

6

İşte Unicode'daki Bağlayıcı Karakterlerinin Listesi . Bunları klavyenizde bulamazsınız.

U +, 005F düşük hat _
u + 203F UNDERTIE ‿
U +, 2040 KARAKTERİ TIE ⁀
U +, 2054 TERS UNDERTIE ⁔
U +, FE33 SUNUMU FORM DİKEY düşük hat _ u
+ FE34 SUNUMU FORM DİKEY DALGALI düşük hat ︴
U +, FE4D kesikli düşük hat ﹍
U + FE4E MERKEZİ DÜŞÜK HATTI ﹎
U + FE4F DALGA DÜŞÜK HATTI ﹏
U + FF3F TAM GENİŞLİĞİ DÜŞÜK HATTI _


5
Hangi klavye düzenini kullandığınızı bilmiyorum, ancak kesinlikle yeterince kolayca yazabilirim (U + 005F) :)
bdonlan

4

İki karakter bağlamak için bir bağlantı karakteri kullanılır.

Java'da bir bağlantı karakteri, Character.getType (int codePoint) / Character.getType (char ch) , Character.CONNECTOR_PUNCTUATION öğesine eşit bir değer döndüren karakterdir .

Java'da karakter bilgilerinin, bağlayıcı karakterleri Connector_Punctuation için bir takma ad olan genel kategori Pc atayarak tanımlayan Unicode standardını temel aldığını unutmayın .

Aşağıdaki kod snippet'i,

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++) {
    if (Character.getType(i) == Character.CONNECTOR_PUNCTUATION
            && Character.isJavaIdentifierStart(i)) {
        System.out.println("character: " + String.valueOf(Character.toChars(i))
                + ", codepoint: " + i + ", hexcode: " + Integer.toHexString(i));
    }
}

jdk1.6.0_45 üzerinde tanımlayıcı başlatmak için kullanılabilecek bağlantı karakterlerini yazdırır

character: _, codepoint: 95, hexcode: 5f
character: ‿, codepoint: 8255, hexcode: 203f
character: ⁀, codepoint: 8256, hexcode: 2040
character: ⁔, codepoint: 8276, hexcode: 2054
character: ・, codepoint: 12539, hexcode: 30fb
character: ︳, codepoint: 65075, hexcode: fe33
character: ︴, codepoint: 65076, hexcode: fe34
character: ﹍, codepoint: 65101, hexcode: fe4d
character: ﹎, codepoint: 65102, hexcode: fe4e
character: ﹏, codepoint: 65103, hexcode: fe4f
character: _, codepoint: 65343, hexcode: ff3f
character: ・, codepoint: 65381, hexcode: ff65

Jdk1.6.0_45 üzerinde aşağıdaki derlemeler,

int _, ‿, ⁀, ⁔, ・, ︳, ︴, ﹍, ﹎, ﹏, _,  = 0;

Görünüşe göre, yukarıdaki bildirim aşağıdaki iki bağlantı karakteri için jdk1.7.0_80 & jdk1.8.0_51 üzerinde derlenememektedir (geriye uyumluluk ... ayy !!! !!!),

character: ・, codepoint: 12539, hexcode: 30fb
character: ・, codepoint: 65381, hexcode: ff65

Her neyse, ayrıntılar bir yana, sınav sadece Temel Latin karakter setine odaklanıyor .

Ayrıca, Java'daki yasal tanımlayıcılar için spesifikasyon burada verilmiştir . Daha fazla ayrıntı almak için Character sınıfı API'lerini kullanın.


1

Java tanımlayıcılarında izin verilen en iyi, eğlenceli karakterlerden biri (başlangıçta olmasa da) "Sıfır Genişlikli Birleştirici Olmayan" (& zwnj ;, U + 200C, https://en.wikipedia.org) / wiki / Zero-width_non-joiner ).

Ben bir kez bu XML başka bir parça için bir referans tutan bir öznitelik değeri içinde bir XML parçası vardı. ZWNJ "sıfır genişlik" olduğu için görülemez (imleçle birlikte yürürken hariç, daha önce karakterin üzerinde görüntülenir). Ayrıca günlük dosyası ve / veya konsol çıktısında da görülemedi. Ama her zaman oradaydı: arama alanlarına kopyala ve yapıştır bunu anladı ve böylece belirtilen konumu bulamadı. Bununla birlikte, () öğesinin görünür kısmını) arama alanına yazmak belirtilen konumu buldu. Bunu çözmem için biraz zamanımı aldı.

Avrupa klavye düzenini kullanırken sıfır genişlikli bir birleştirici yazmak aslında oldukça kolaydır (çok kolay), en azından Almanca varyantında, örneğin "Europatastatur 2.02" - AltGr + "ile ulaşılabilir." ne yazık ki çoğu klavyede doğrudan yan yana bulunur ve yanlışlıkla kolayca vurulabilir.

Java'ya Geri Dön: İyi düşündüm, şöyle bir kod yazabilirsiniz:

void foo() {
    int i = 1;
    int i = 2;
}

İkincisi i sıfır genişlikli bir marangoz eklenmedi (yukarıdaki kodda stackoverflow'ın editöründe kesilemez), ama işe yaramadı. IntelliJ (16.3.3) şikayet etmedi, ancak JavaC (Java 8) önceden tanımlanmış bir tanımlayıcıdan şikayet etti - JavaC aslında bir tanımlayıcının parçası olarak ZWNJ karakterine izin veriyor gibi görünüyor, ancak ne yaptığını görmek için yansıma kullanırken, ZWNJ karakter tanımlayıcıdan çıkarılır - characters gibi karakterlerin olmadığı bir şey.


0

Tanımlayıcılarınızın içinde (sadece başlangıçta değil) kullanabileceğiniz karakterlerin listesi çok daha eğlencelidir:

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
    if (Character.isJavaIdentifierPart(i) && !Character.isAlphabetic(i))
        System.out.print((char) i + " ");

Liste:

I wanted to post the output, but it's forbidden by the SO spam filter. That's how fun it is!

Kontrol karakterlerinin çoğunu içerir! Yani çanlar ve bok! Kaynak kodunuzu fn zilini çalabilirsiniz! Veya yalnızca kısa çizgi gibi görüntülenecek karakterleri kullanın.


DEL karakteri \ u007f içerir. :-(
Todd O'Bryan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.