回答:
一般に、ラッパークラスは、別のクラスまたはコンポーネントの機能を「ラップ」または「カプセル化」するクラスです。これらは、基礎となるクラスまたはコンポーネントの実装から抽象化のレベルを提供することにより役立ちます。たとえば、COMコンポーネントをラップするラッパークラスは、呼び出し元のコードに煩わされることなく、COMコンポーネントを呼び出すプロセスを管理できます。また、関連するインターフェイスポイントの数を減らすことで、基になるオブジェクトの使用を簡略化することもできます。多くの場合、これにより、基盤となるコンポーネントをより安全に使用できます。
ラッパークラスは、プリミティブ型をオブジェクトとして使用する方法を提供します。プリミティブごとに、次のようなラッパークラスがあります。
int Integer
byte Byte
IntegerおよびByteは、プリミティブintおよびbyteのラッパークラスです。プリミティブをオブジェクトとして使用する必要がある場合には時間と制限があるため、ラッパークラスはボクシング/アンボクシングと呼ばれるメカニズムを提供します。
概念は次の例でよく理解できます。
double d = 135.0 d;
Double doubleWrapper = new Double(d);
int integerValue = doubleWrapper.intValue();
byte byteValue = doubleWrapper.byteValue();
string stringValue = doubleWrapper.stringValue();
これが方法です。ラッパークラスタイプを使用して、他のプリミティブタイプに変換することもできます。このタイプの変換は、プリミティブ型をオブジェクトに変換し、それらを使用して他のプリミティブを取得する必要がある場合に使用されます。ただし、このアプローチでは、大きなコードを記述する必要があります。ただし、コードスニペットは次のように実現できるため、同じことは単純なキャスト手法でも実現できます。
double d = 135.0;
int integerValue = (int) d ;
double値は明示的に整数値に変換されますが、ダウンキャストとも呼ばれます。
ラッパークラスは、その名前のように、他のものを「ラップ」するクラスです。
より正式な定義は、Adapter Patternを実装するクラスです。これにより、1セットのAPIをより使いやすく、読みやすい形式に変更できます。たとえば、C#では、ネイティブWindows APIを使用する場合、.NET設計ガイドラインに準拠するクラスにそれをラップすると役立ちます。
ラッパークラスと呼ぶことができるいくつかのデザインパターンがあります。
「プロキシ、デコレータ、アダプタ、およびブリッジのパターンはどのように違うのですか?」に対する私の回答を参照してください。
一部の環境では、ラッパークラスが実行する機能の多くがアスペクトに置き換えられていることに注意してください。
編集:
一般に、ラッパーは、wrappeeの実装を気にせずに、wrappeeの機能を拡張します。それ以外の場合は、ラップするクラスと拡張するクラスの違いはありません。典型的な例は、そのインターフェイスのすべての実装に追加するのではなく、他のサービスインターフェイスの周りにタイミング情報またはロギング機能を追加することです。
これは、アスペクトプログラミングの典型的な例になります。関数ごとにインターフェイス関数を調べてボイラープレートロギングを追加するのではなく、アスペクトプログラミングでメソッドの一種の正規表現であるポイントカットを定義し、一致するすべてのメソッドの前、後、または周囲で実行するメソッドを宣言しますポイントカット。アスペクトプログラミングは、ラッパークラスも使用できるDecoratorパターンの一種の使用であると言うのはおそらく公正ですが、どちらのテクノロジーにも他の用途があります。
ラッパークラスは、通常、オブジェクトをプライベートプロパティとして持つクラスです。ラッパーはそのプライベートオブジェクトのAPIを実装するので、プライベートオブジェクトが行う場所として引数として渡すことができます。
コレクションがあり、オブジェクトが追加されたときになんらかの変換を使用したいとします。すべてのコレクションのメソッドを持つラッパークラスを記述します。add()が呼び出されると、ラッパーは引数をプライベートコレクションに渡すのではなく、変換します。
ラッパーは、コレクションを使用できる場所であればどこでも使用できます。プライベートオブジェクトは、ラッパーを参照して読み取る他のオブジェクトを保持できます。
Javaプログラミングは、各プリミティブデータ型にラッパークラスを提供し、プリミティブデータ型をラッパークラスの対応するオブジェクトに変換します。
ラッパークラスは、プログラマーの基本的なニーズを満たすために存在するようになりました。その名前が示唆するように、ラッパークラスはプリミティブ値をラップし、その値をオブジェクトに保持します。したがって、ジェネリック、ハッシュマップキー、アレイリストなど、プリミティブが許可されなかったすべての場所で、プログラマーはこれらのプリミティブ値を対応するラッパータイプとして提供するオプションを利用できるようになりました。
さらに、これらのラッパータイプには、プリミティブタイプから対応するラッパータイプへの変換、およびその逆の変換や、文字列からラッパータイプへの変換、およびその逆の変換のためのユーティリティメソッドがいくつかあります。
私は私のラッパークラスの詳細な記事を私のブログでラッパータイプの概念を説明する詳細な記事を書いています-http ://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (開示-このブログは私が所有しています)
私は現在、プロジェクトにラッパークラスを使用しており、得られる主な利点(トピックの説明を広げるための1つの利点)です。
例外処理:別のクラスがラップする私のメインクラスには、例外が発生した場合に例外をスローするメソッドがあるため、例外を処理してすぐにログに記録するラッパークラスを作成しました。したがって、私のメインスコープでは、例外処理はありません。メソッドを呼び出して何かをするだけです。
簡単な使用法:オブジェクトを簡単に開始できます。通常、開始フェーズは多くのステップで構成されています。
コードの可読性:別のプログラマーが私のコードを開くと、コードは非常に明確で操作しやすいように見えます。
詳細を非表示にする:別のプログラマが使用するクラスを生成する場合、「エラー処理、例外処理、ログメッセージなど...」などの詳細をラップして、プログラマが処理する必要がないようにすることができます。カオスは、単にメソッドを使用するだけです。
ラッパークラスは、何かを保持し、それに機能を追加するという唯一の目的を果たすクラスです。Javaでは、プリミティブ(int、floats、charsなど)はオブジェクトではないため、プリミティブを扱いたい場合は、ラッパークラスを使用する必要があります。intのベクターを作成するとします。問題はベクターがプリミティブではなくオブジェクトのみを保持していることです。だからあなたがすることはすべてのintをIntegerラッパーに入れてそれを使うことです。例:
int number = 5;
Integer numberWrapped = new Integer(number);
//now you have the int in an object.
//and this is how to access the int value that is being wrapped.
int again = numberWrapped.intValue();
ラッパーは、異なるプラットフォーム間で2つの異なるアプリケーション間で通信するために使用されるクラスです