Java dilinde yüceltilmiş sınıflar


96

Standart Java API'deki bazı sınıflar, diğer sınıflardan biraz farklı olarak ele alınır. Derleyici ve / veya JVM'nin özel desteği olmadan uygulanamayan sınıflardan bahsediyorum.

Hemen ortaya çıkardıklarım:

  • Object (belli ki) olduğu gibi, diğer şeylerin yanı sıra bir süper sınıfı yok.
  • String dilin + operatörü için özel desteği olduğundan.
  • Thread Yürütmeyi "çatallayan" hiçbir bayt kodu komutu olmamasına rağmen bu sihirli start () yöntemine sahip olduğundan.

Sanırım bunlar gibi tüm sınıflar bir şekilde JLS'de bahsedilmiştir. Yanlışsam düzelt.

Her neyse, bu tür başka hangi sınıflar var? Java dilinde "yüceltilmiş sınıfların" tam listesi var mı?


2
Jenerikler neredeyse uyuyor, ancak tam olarak değil. Bir derleyici numarası kullanılarak uygulanırlar, ancak tek bir sınıfa izole edilmezler.
Bill the Lizard

2
Hepsi saygı türleridir. ;-)
starblue

1
"Thread.start" büyülü mü? Elbette bunu yapmak için çağrılan bir yerel koddur?
jcoder

Bu düşünce beni de etkiledi. Belki de JNI tek başına Thread sınıfını uygulamak için yeterlidir. Sanırım bunu yapmaya çalışırsam, işletim sistemi düzeyinde bir iş parçacığı api kullanacağım, yürütmeyi start () yönteminin uygulanmasında çatallayacağım, çatallı iş parçacığında run () yöntemini çalıştıracağım ve geri döneceğim. Ama sonra benim OS iplik çalışmaya devam ediyorum. Bu, JVM tarafından oluşturulan konularla birlikte sorunsuz çalışır mı? ve JLS bellek modelini onurlandırmak mı?
aioobe

2
Spesifikasyona göre, bir iş parçacığı oluşturmanın tek yolu Thread sınıfındandır ( java.sun.com/docs/books/jvms/second_edition/html/… ). Tabii ki, JVM ile bazı sıfır seviyeli iletişimlere dayanır, ancak kendi JNI'nizi yaparsanız, bir iş parçacığı başlatabilirsiniz, ancak JVM'nin ne yaptığınızı anlamasını sağlayamazsınız (kilitler, bellek modeli vb. ). İş parçacığı, belirtimin kendisine özel bir ayrıcalık - bir iş parçacığı başlatmanın tek yolu - ataması nedeniyle ayrıcalıklıdır.
Yishai

Yanıtlar:


35

Pek çok farklı cevap var, bu yüzden hepsini toplamanın (ve bazılarını eklemenin) faydalı olacağını düşündüm:

Sınıflar

  • AutoBoxing sınıfları - derleyici yalnızca belirli sınıflara izin verir
  • Sınıf - kendi değişmez değerlerine sahiptir (örneğin, int.class). Yeni örnekler oluşturmadan genel yazımını da eklerdim.
  • Dize - aşırı yüklenmiş + -operatör ve değişmez değerlerin desteğiyle
  • Enum - bir switch ifadesinde kullanılabilen tek sınıf (yakında String'e de verilecek bir ayrıcalık). Aynı zamanda başka şeyler de yapar (otomatik statik yöntem oluşturma, serileştirme işleme, vb.), Ancak bunlar teorik olarak kodla gerçekleştirilebilir - bu sadece çok sayıda standart metindir ve bazı kısıtlamalar alt sınıflarda (örn. özel alt sınıflandırma kuralları), ancak bir numaralandırmanın ayrıcalıklı durumu olmadan asla başaramayacağınız şey, onu bir switch ifadesine dahil etmektir.
  • Nesne - tüm nesnelerin kökü (ve onun klonlama ve sonlandırma yöntemlerini ekleyeceğim, uygulayabileceğiniz bir şey değildir)
  • Kaynaklar : WeakReference, SoftReference, PhantomReference
  • Konu - dil size bir iş parçacığı başlatmak için belirli bir talimat vermez, bunun yerine onu sihirli bir şekilde start () yöntemine uygular.
  • Throwable - throw, throws ve catch ile çalışabilen tüm sınıfların kökü ve ayrıca Exception vs. RuntimeException ve Error derleyicisinin anlayışı.
  • NullPointerException ve athrow dışındaki diğer bayt kodu talimatları tarafından atılabilen ArrayIndexOutOfBounds gibi diğer istisnalar.

Arayüzler

  • Yinelenebilir - gelişmiş bir for döngüsünde kullanılabilen tek arabirim

Saygıdeğer sözler:

  • java.lang.reflect. Dizi - bir Class nesnesi tarafından tanımlandığı şekilde yeni bir dizi oluşturmak mümkün olmayacaktır.
  • Ek açıklamalar Çalışma zamanında bir arayüz gibi davranan özel bir dil özelliğidir. Kesinlikle başka bir Ek Açıklama arayüzü tanımlayamazsınız, tıpkı Object için bir yedek tanımlayamadığınız gibi. Bununla birlikte, tüm işlevlerini uygulayabilir ve yansıtma yerine bunları (ve bir sürü standart metne) geri getirmenin başka bir yoluna sahip olabilirsiniz. Aslında, ek açıklamalar sunulmadan önce birçok XML tabanlı ve javadoc etiket tabanlı uygulama vardı.
  • ClassLoader - JVM ile kesinlikle ayrıcalıklı bir ilişkiye sahiptir, çünkü bir sınıfı yüklemenin dil yolu yoktur, ancak bir bayt kodu yolu vardır, bu nedenle bu şekilde Array gibidir. Ayrıca, bu bir uygulama ayrıntısı olmasına rağmen, JVM tarafından geri çağrılma ayrıcalığına da sahiptir.
  • Serileştirilebilir - işlevselliği yansıtma yoluyla uygulayabilirsiniz, ancak kendi ayrıcalıklı anahtar kelimesine sahiptir ve bazı senaryolarda SecurityManager ile yakınlaşmak için çok zaman harcarsınız.

Not: JNI sağlayan şeyleri (IO gibi) listenin dışında bıraktım çünkü çok istekli olsaydınız kendi JNI çağrınızı her zaman uygulayabilirsiniz. Ancak, JVM ile ayrıcalıklı şekillerde etkileşim kuran yerel çağrılar farklıdır.

Diziler tartışmaya açıktır - Nesneyi miras alırlar, anlaşılmış bir hiyerarşiye sahiptirler (Nesne [], Dize [] 'nin bir süper tipidir), ancak bunlar kendi başına tanımlanmış bir sınıf değil, bir dil özelliğidir.


@Donal, çok doğru, çalışma zamanı açıklamasını düşünüyordum, ancak kaynak düzeyi açıklamaları gerçekten de bu şekilde yapıldı (xdoclet en belirgin şekilde, hatta çekirdek java'da @deprecated)
Yishai

Başlangıçta xdoclet işleme ile yazılan ve ardından ek açıklamalara dönüştürülen bir kod ağıyla savaşıyorum. Oh, ek açıklamaları buna nasıl tercih ederim (her ne kadar uygun maven büyüleriyle net etki aynı olsa da).
Donal Fellows

@ KK_07k11A0585, Koleksiyonlar, herkes tarafından farklı bir şekilde oluşturulabilen standart bir api'dir (aslında ilkellere göre tasarlanmış alternatif uygulamalar ve onları geliştiren çok ünlü bir Google projesi vardır). Özel olan tek şey, cevapta belirtilen yinelenebilirdir. Elbette bunlar java programlamanın ekmek ve tereyağıdır, ancak özel ayrıcalıkları olmayan normal sınıflardır.
Yishai

@Yishai Herhangi bir uygulamayı geliştirirken, en önemlisi VERİ YÖNETİMİ'dir. Hepimiz bir görevi farklı şekillerde yapabiliriz, ancak optimize edilmiş yol, daha az bellek kaplayan ve gereksiz referansları daha az kullanan yöntemdir. Koleksiyonları kullanarak, Binary Search, Merge Sort vb. Gibi önceden tanımlanmış algoritmalar sağlayan büyük miktarda veriyi sıralayabilir, arayabilir ve karşılaştırabiliriz. Ayrıca bize, tekniklerimizi özelleştirmek için Karşılaştırıcı ve Karşılaştırılabilir Arayüzler sağlar. Koleksiyonlar sınıfı java'daki en iyi sınıf olmayabilir, ancak şüphesiz yüceltilmiş niteliklerin bir sınıfıdır.
KK_07k11A0585

1
Peki ya SecurityManager? Ya da yansıtma veya serileştirme ile ilgili herhangi bir şey?
Antimon

19

Class, elbette. Kendi gerçekleri vardır ( StringBTW ile paylaştığı bir ayrım ) ve tüm bu yansıma büyüsünün başlangıç ​​noktasıdır.


Ah, iyi nokta. Öyleyse bir sınıf edebi örneği nedir? MyClass.class'ı mı kastediyorsunuz?
aioobe

4
@aioobe: aynen. Ayrıca int.class, char.class vb. Sahip olduğunuza da dikkat edin
Michael


12
  1. Sıralama. Alt sınıflara almanıza izin verilmez, ancak derleyici bunu yapabilir.
  2. Java.util.concurrent altındaki pek çok şey JVM desteği olmadan uygulanabilir, ancak çok daha az verimli olurlar.

1
Numaralandırmaları anonim olarak alt sınıflara ayırabilirsiniz (bu, numaralandırma değerleri için ziyaretçi kalıbı uygulamasının temelidir). Ama evet, bir numaralandırmayı tam olarak alt sınıflandıramazsınız ;-)
Thierry


10

Önemli sınıflardan bahsedildiği için bazı arayüzlerden bahsedeceğim:

Iterable(1.5 beri) arayüzü - bir amacı, bir foreach döngüsü katılmasını sağlar:

Iterable<Foo> iterable = ...;
for (Foo foo : iterable) {

}

SerializableArayüz standart arayüzünden farklı çok özel bir anlamı vardır. Arayüzde tanımlanmamış olsalar bile dikkate alınacak yöntemleri tanımlayabilirsiniz (gibi readResolve()). transientAnahtar kelime davranışını etkileyen dil öğesidir Serializablegerçeklenimcileri.


Doğru, onlar arayüz olsa da, her seferinde "özel" bir uygulama gerektirmezler. (Throwable'a benzer.)
aioobe

Serileştirilebilir aslında özel uygulama gerektirir. İki yönteme sahip olmanız beklenen bir arayüzdür (isimleri unuttum ... Google'da kullanabilirim ...) ancak bunlar gerekli veya standart arayüz şemasında tanımlanmadı.
corsiKa

@glowcoder: Bununla birlikte, bir zamanlar Serializable'ın tüm özelliğinin Java dili ile ilgili olmadığını, yalnızca ObjectOutputStream ve ObjectInputStream'in uygulanmasıyla ilgili olduğunu iddia edebilirdi.
Michael Borgwardt

5
@Michael Borgwardt o var - transientanahtar kelime
Bozho

1
Sanmıyorum - Comparableiçsel hiçbir şeye katılmıyor . Aynı işlevsellikle kolayca yazabilir NewComparableve yeni NewArrays.sort(..)
şeyler yapabilirsiniz

6
  1. Throwable , RuntimeException, Error AssertionError
  2. Kaynaklar WeakReference, SoftReference, PhantomReference
  3. Sıralama
  4. Ek açıklama

Güzel liste. +1, Ek açıklama bir arayüzdür ve uygulaması yoktur.
aioobe

1
Ek açıklamalar, derleyici tarafından normal arabirimlerden farklı şekilde ele alınır. Enum'a benzer şekilde hepsi Annotation'ı genişletir ve derleyici bunu otomatik olarak yapar. JavaDoc of Annotation'dan: Tüm açıklama türleri tarafından genişletilen ortak arabirim. Bunu manuel olarak genişleten bir arabirimin bir açıklama türünü tanımlamadığını unutmayın. Ayrıca, bu arayüzün kendi başına bir açıklama tipi tanımlamadığını unutmayın. Dolayısıyla, normal sözdizimini kullanarak bir açıklama oluşturamazsınız, onları eklemek için derleyiciyi değiştirmeleri gerekiyordu.
Andrei Fierbinteanu



2

Bundan emin değilim. Ancak IO nesnelerini manuel olarak uygulamanın bir yolunu düşünemiyorum.


Haklısın, saf Java ile uygulanamazlar. JNI aracılığıyla uygulanmaları gerekir (tıpkı sistem çağrıları yapması gereken diğer sınıflar gibi). Ancak bunun dışında, derleyici veya jvm'den özel bir desteğe ihtiyaçları yoktur.
aioobe

2

SystemSınıfta biraz sihir var .

System.arraycopy yerel koda bir bağlantıdır

public static native void arraycopy(Object array1, int start1, 
  Object array2, int start2, int length);

fakat...

/**
 * Private version of the arraycopy method used by the jit
 * for reference arraycopies
 */
private static void arraycopy(Object[] A1, int offset1,
  Object[] A2, int offset2, int length) {
   ...
}

1
Heys cevabın ikinci kısmı ile ne demek istiyorsun?
Pacerier

1

İddianın özel olarak ele alındığından beri. İşte jvm tarafından özel olarak ele alınan birkaç istisna türü:

  • NullPointerException
  • Aritmetik İstisna.
  • StackOverflowException
  • Her türlü OutOfMemoryErrors
  • ...

İstisnalar özel değildir, ancak jvm bunları özel durumlarda kullanır, bu nedenle bunları kendi jvm'nizi yazmadan kendiniz uygulayamazsınız. Eminim etrafta daha özel istisnalar vardır.


0

Bu sınıfların çoğu, derleyicinin veya JVM'nin 'özel' yardımı ile gerçekten uygulanmaz. Nesne, dahili JVM yapıları etrafında dolaşan bazı yerelleri kaydeder, ancak bunu kendi sınıflarınız için de yapabilirsiniz. (Bunun semantiğe tabi olduğunu kabul ediyorum, "JVM'de tanımlanmış bir yerel çağrılar" özel JVM desteği olarak kabul edilebilir.)

Özel olan / olan / özel olan, bu iç yapıları nasıl başlattıklarına ilişkin 'yeni' ve 'atma' talimatlarının davranışıdır.

Ek açıklamalar ve sayılar hemen hemen tuhaftır.


4
aioobe, özel destek yapılarına sahip oldukları için kendiniz uygulayamayacağınız sınıfları ifade eder. Java.lang.Object biçimini miras almadan, tür sisteminin kökü olarak kendi Nesne sınıfınızı oluşturamazsınız. Object, bir kök sınıf olduğundan emin olmak için hem derleyiciden hem de jvm'den özel desteğe sahiptir. Yerel aramalar bunun üstesinden gelmek için yeterli değil.
josefx
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.