Java言語で称賛されたクラス


96

標準Java APIの一部のクラスは、他のクラスとは少し異なって扱われます。コンパイラやJVMからの特別なサポートなしでは実装できなかったクラスについて話しています。

私がすぐに思いつくものは:

  • Object (当然のことながら)とりわけ、スーパークラスはありません。
  • String +演算子が言語で特別にサポートされているためです。
  • Thread 実行を「フォーク」するバイトコード命令がないにもかかわらず、この魔法のstart()メソッドがあるからです。

これらのクラスはすべてJLSで何らかの形で言及されていると思います。私が間違っていたら訂正してください。

とにかく、そのようなクラスは他に何がありますか?Java言語の「栄光のあるクラス」の完全なリストはありますか?


2
ジェネリックはほぼ適合しますが、完全ではありません。これらはコンパイラトリックを使用して実装されていますが、1つのクラスに分離されていません。
トカゲに請求する

2
それらはすべて敬意のタイプです。;-)
starblue 2010

1
「thread.start」は魔法ですか?確かにこれは、これを行うために呼び出されたいくつかのネイティブコードだけですか?
jcoder

その考えも私を襲った。おそらく、JNIだけでThreadクラスを実装するのに十分です。これを行おうとすると、OSレベルのスレッドAPIを使用し、start()メソッドの実装で実行をフォークし、フォークしたスレッドでrun()メソッドを実行して戻ります。しかし、私の OSスレッドは実行を続けます。JVMによって作成されたスレッドと一緒にスムーズに実行されますか?JLSメモリモデルなどを尊重しますか?
aioobe 2010

2
仕様によると、スレッドを作成する唯一の方法はThreadクラス(java.sun.com/docs/books/jvms/second_edition/html/…)からです。もちろん、JVMとのナイティブレベルの通信に依存しますが、独自のJNIを実行した場合、スレッドを開始する可能性がありますが、JVMが何をしているのか(ロック、メモリモデルなど)を理解できません。 )。仕様に特別な特権(スレッドを開始する唯一の方法)が割り当てられているという点で、スレッドには特権があります。
Yishai

回答:


35

答えはたくさんあるので、全部集めて(そしていくつか加えて)おくと便利だと思いました。

クラス

  • AutoBoxingクラス-コンパイラーは特定のクラスのみを許可します
  • クラス -独自のリテラルを持っています(たとえば、int.class)。また、新しいインスタンスを作成せずに、その一般的な型付けを追加します。
  • 文字列 -オーバーロードされた+-演算子とリテラルのサポート
  • Enum -switchステートメントで使用できる唯一のクラス(すぐにStringにも特権が与えられる)。他のことも行います(自動静的メソッドの作成、シリアル化の処理など)が、理論的にはコードで実現できます。これは単なる定型文であり、一部の制約はサブクラス(たとえば、特別なサブクラス化ルール)ですが、列挙型の特権ステータスがないと達成できないことは、switchステートメントにそれを含めることです。
  • オブジェクト -すべてのオブジェクトのルート(そして、そのcloneとfinalizeメソッドを追加しますが、実装できるものではありません)
  • 参照:WeakReference、SoftReference、PhantomReference
  • スレッド -言語はスレッドを開始する特定の指示を与えず、魔法のようにそれをstart()メソッドに適用します。
  • Throwable -throw、throws、catchで機能するすべてのクラスのルート、およびコンパイラによるExceptionとRuntimeExceptionおよびErrorの理解。
  • NullPointerExceptionと、athrow以外のバイトコード命令によってスローされる可能性のあるArrayIndexOutOfBoundsなどの他の例外。

インターフェース

  • Iterable-拡張forループで使用できる唯一のインターフェース

名誉ある言及は次のとおりです。

  • java.lang.reflect。配列-Classオブジェクトで定義された新しい配列を作成することはできません。
  • 注釈これらは、実行時にインターフェースのように動作する特別な言語機能です。Objectの代替を定義できないのと同じように、別のAnnotationインターフェースを定義することはできません。ただし、それらすべての機能を実装し、リフレクションではなく、それら(およびボイラープレートの全体)を取得する別の方法を用意することもできます。実際、注釈が導入される前は、XMLベースおよびjavadocタグベースの実装が数多くありました。
  • ClassLoader-クラスをロードするための言語的な方法がないため、JVMとの特権関係は確かにありますが、バイトコードの方法はあります。また、実装の詳細ですが、JVMからコールバックされるという特別な特権もあります。
  • シリアライズ可能 -リフレクションを介して機能を実装できますが、独自の特権付きキーワードがあり、シナリオによってはSecurityManagerに慣れるのに多くの時間を費やすことになります。

注:JNI(IOなど)を提供するものはリストから省略しました。これは、必要に応じて独自のJNI呼び出しを実装できるためです。ただし、JVMと特権的に相互作用するネイティブ呼び出しは異なります。

配列は議論の余地があります-オブジェクトを継承し、階層を理解しています(Object []はString []のスーパータイプです)が、それらは言語機能であり、それ自体で定義されたクラスではありません。


@Donal、非常に真実、ランタイムアノテーションを考えていましたが、ソースレベルのアノテーションは確かにそのように行われていました(xdocletが最も顕著に、またはコアのJavaで@deprecatedが使用されています)
Yishai

私は、もともとxdoclet処理で記述され、その後注釈に変換されたコードの茂みを通り抜けて戦い続けてきました。ああ、私はそれよりもアノテーションを好む(ただし、適切なmavenの呪文を使用しても、正味の効果は同じです)。
ドナルフェロー

@ KK_07k11A0585、コレクションは標準的なAPIであり、だれでも別の方法で構築できます(実際、プリミティブを中心とした代替実装や、それらを強化する非常に有名なGoogleプロジェクトがあります)。彼らが得る特別な唯一のものは、答えで述べられているIterableです。確かに、これらはJavaプログラミングの主役ですが、これらは通常のクラスであり、特別な権限はありません。
Yishai 2012

@Yishaiアプリケーションを開発する際、重要なことはデータ管理です。私たちは皆、さまざまな方法でタスクを実行できますが、最適化された方法は、メモリの使用量が少なく、不要な参照の使用が少ない方法です。コレクションを使用することで、大量のデータを並べ替え、検索、比較できます。これにより、バイナリ検索、マージ並べ替えなどの事前定義されたアルゴリズムが提供されます。また、手法をカスタマイズするためのコンパレータおよび比較可能なインターフェイスも提供されます。コレクションクラスはJavaで最高のクラスではないかもしれませんが、間違いなく名誉ある品質のクラスです。
KK_07k11A0585 2012

1
どうSecurityManagerですか?または、リフレクションまたはシリアル化に関連するものはありますか?
アンチモン2012年

19

Class、 もちろん。これには独自のリテラル(StringBTW との違い)があり、すべてのリフレクションマジックの開始点です。


ああ、良い点。では、クラスリテラルの例は何でしょうか。MyClass.classを参照していますか?
aioobe 2010

4
@aioobe:まさに。int.class、char.classなどもあることに注意してください
Michael Borgwardt


12
  1. 列挙型。サブクラス化は許可されていませんが、コンパイラーは可能です。
  2. java.util.concurrentの下の多くのものは、JVMサポートなしで実装できますが、効率が大幅に低下します。

1
列挙型を匿名でサブクラス化できます(列挙型の値に対する訪問者パターン実装のベースです)。しかし、はい、列挙型を完全にサブクラス化することはできません;-)
ティエリー


10

重要なクラスについて言及したので、いくつかのインターフェースについて言及します。

Iterable(1.5以降)インタフェース-それは、オブジェクトがforeachループに参加することを可能にします。

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

}

Serializableインターフェースは、標準のインターフェイスとは異なる非常に特別な意味を持っています。インターフェースで定義されていない場合でも考慮されるメソッドを定義できます(などreadResolve())。transientキーワードはの行動に影響する言語要素でSerializable実装します。


確かに、これらはインターフェースですので、一見すると「特別な」実装は必要ありません。(Throwableに似ています。)
aioobe 2010

Serializableは実際には特別な実装を必要とします。それはあなたが2つのメソッドを持っていることが期待されるインターフェースです(名前を忘れました...私はそれをグーグルすることができます...)が、それらは標準のインターフェーススキームで必要とされたり定義されていません。
corsiKa 2010

@glowcoder:ただし、Serializableの特殊性はすべてJava言語には関係なく、ObjectOutputStreamとObjectInputStreamの実装にのみ関係があると主張することもできます。
Michael Borgwardt 2010

5
@Michael Borgwardtそれは持っている- transientキーワード
Bozho

1
私はそうは思わない- Comparable内部の何かには参加しない。同じ機能を使用して簡単に作成NewComparableおよび新規作成できNewArrays.sort(..)ます
Bozho 2010

6
  1. スロー可能、RuntimeException、Error AssertionError
  2. 参考文献弱い参照、SoftReference、PhantomReference
  3. 列挙型
  4. 注釈

いいリスト。+ 1、Annotationはインターフェースですが、実装されていません。
aioobe 2010

1
注釈は、コンパイラによって通常のインターフェースとは異なる方法で処理されます。enumと同様に、それらはすべてAnnotationを拡張し、コンパイラはそれを自動的に行います。注釈のJavaDocから:すべての注釈タイプによって拡張された共通インターフェース。これを手動で拡張するインターフェースは注釈型を定義しないことに注意してください。また、このインターフェース自体は注釈型を定義しないことに注意してください。そのため、通常の構文を使用して注釈を作成することはできません。注釈を追加するには、コンパイラを変更する必要がありました。
Andrei Fierbinteanu 2010



2

わからない しかし、IOオブジェクトを手動で実装する方法は考えられません。


そうです、それらは純粋なJavaで実装することはできません。これらは、JNIを介して実装する必要があります(システムコールを実行する必要がある他のクラスと同様)。ただし、それ以外は、コンパイラやjvmによる特別なサポートは必要ありません。
aioobe 2010

2

Systemクラスには魔法があります。

System.arraycopy ネイティブコードへのフックです

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

だが...

/**
 * 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
答えの2番目の部分はどういう意味ですか。
Pacerier

1

よくアサートの特別な処理以来言及されてきました。以下に、jvmによる特別な処理があるいくつかの例外タイプを示します。

  • NullPointerException
  • ArithmeticException。
  • StackOverflowException
  • すべての種類のOutOfMemoryErrors
  • ...

例外は特別ではありませんが、jvmは特別な場合にそれらを使用するため、独自のjvmを作成せずにそれらを自分で実装することはできません。周りにはもっと特別な例外があると思います。


0

これらのクラスのほとんどは、コンパイラまたはJVMからの「特別な」ヘルプを使用して実際に実装されていません。Objectは、内部JVM構造をたどるいくつかのネイティブを登録しますが、独自のクラスに対してもそれを行うことができます。(これはセマンティクスの影響を受けることを認めます。「JVMで定義されたネイティブを呼び出す」は特別なJVMサポートと見なすことができます。)

/ is /が特別なのは、これらの内部構造を初期化する方法の「新しい」および「スロー」命令の動作です。

ただし、注釈と番号はかなり奇抜です。


4
aioobeは、特別な組み込みサポートがあるため、自分で実装できないクラスを指します。フォームjava.lang.Objectを継承しないと、型システムのルートとして独自のObjectクラスを作成できません。オブジェクトは、それがルートクラスであることを確認するために、コンパイラとjvmの両方から特別なサポートを受けています。これを回避するには、ネイティブコールでは不十分です。
josefx 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.