ラッパー
| 日本語 | 包む者 |
| 英語 | wrapper |
| ふりがな | らっぱー |
| フリガナ | ラッパー |
他のクラス、変数、システムを「覆い隠す」ために存在するクラス。
他のクラスや変数をフィールドとして持ち、隠蔽し管理し操作するためのクラスを「ラッパークラス」「ラップクラス」と呼ぶ。
言語仕様的な決まりはなく、明確な定義もない。
通常ラッパークラスは、クラスもしくは変数ひとつを「包み込む対象」として選び、それをフィールドとして持つ。そのフィールドへは直接外からアクセスできないようにし、間接的にアクセスするためのメソッドを用意する。そのメソッドは「包み込む対象」を安全かつ十分に使用できるものを用意する。
このような条件に当てはまるクラスを一般的にそう呼ぶ、ということである。
ラッパークラスとする目的は様々である。
目的のひとつに、隠す対象のクラスが使いにくいため、使いやすいメソッドを提供するため、というものがある。引数が複雑だったり、複数のメソッドを順番に呼ぶ必要があったりする場合に、これらを使用せず簡易な方法を用意する目的で、包み込みメソッドを用意するわけである。
また、隠す対象が直接操作されるのを避けるためだったり、隠す対象が持つ機能とは別の形での機能を提供するためだったり、といったことがラッパークラスを作る目的となる。
いずれも、「使う側」と「隠す対象」の間に「ラッパークラスのメソッド」を挟んでいる。このメソッドを仲介役とすることで、「隠す対象」への直接のアクセスを避けつつ、付加価値を加えている。
ラッパークラスの具体例のひとつに、int型に対するIntegerクラスが挙げられる。
Integerクラスはint型のラッパークラスとして機能し、int型が持たない「クラスとしての機能」を提供する。APIリファレンスには「The Integer class wraps a value of the primitive type int in an object.」と書かれており、この「wraps」が「覆い隠す」という意味になる。
プリミティブ型は、全ての型に対応するラッパークラスが存在する。
プリミティブ型に対応するラッパークラスは、以下の通り。
・byte → Byte
・short → Short
・int → Integer
・long → Long
・float → Float
・double → Double
・char → Character
・boolean → Boolean
これらのラッパークラスは「インスタンスは不変」なため、インスタンス内の値を変更することはできない。
この機能によって、ラッパークラスはよりプリミティブ型に近い扱いが可能となっている。
詳しくは「インスタンスは不変」の項目を参照。
また、オートボクシングによってプリミティブ型との変換が簡単にできるようになっている。詳しくは「ボクシング変換」「アンボクシング変換」の項目を参照。
これらはプリミティブ型にはない便利なメソッドを持ち、かつプリミティブ型が持たない「参照」を用いた処理を行うことができる。
特にこれはArrayListクラス等のコレクションを使用する場合に必要となる。コレクションクラスの要素はObjectクラスとなっているため、プリミティブ型を格納することができない。また、ジェネリッククラスやジェネリックメソッドの型パラメーター(「<T>」のこと)にもプリミティブ型を使用することができない。
そのため、コレクションの要素にプリミティブ型を使用したい場合には、その代わりに対応するラッパークラスを使用することになる。
また、ラッパークラスを使用することでプリミティブ型にはない「null」という状態を持つことができる。それにより、数値の入力を受け取る際に「入力なし」という状態を「null」で表現することができる。
「ラッパー」と言っても「Yo!」とか言う人達とは関係ないので注意。
意味的には「クレラップ」「サランラップ」の方が近い。
他のクラスや変数をフィールドとして持ち、隠蔽し管理し操作するためのクラスを「ラッパークラス」「ラップクラス」と呼ぶ。
言語仕様的な決まりはなく、明確な定義もない。
通常ラッパークラスは、クラスもしくは変数ひとつを「包み込む対象」として選び、それをフィールドとして持つ。そのフィールドへは直接外からアクセスできないようにし、間接的にアクセスするためのメソッドを用意する。そのメソッドは「包み込む対象」を安全かつ十分に使用できるものを用意する。
このような条件に当てはまるクラスを一般的にそう呼ぶ、ということである。
ラッパークラスとする目的は様々である。
目的のひとつに、隠す対象のクラスが使いにくいため、使いやすいメソッドを提供するため、というものがある。引数が複雑だったり、複数のメソッドを順番に呼ぶ必要があったりする場合に、これらを使用せず簡易な方法を用意する目的で、包み込みメソッドを用意するわけである。
また、隠す対象が直接操作されるのを避けるためだったり、隠す対象が持つ機能とは別の形での機能を提供するためだったり、といったことがラッパークラスを作る目的となる。
いずれも、「使う側」と「隠す対象」の間に「ラッパークラスのメソッド」を挟んでいる。このメソッドを仲介役とすることで、「隠す対象」への直接のアクセスを避けつつ、付加価値を加えている。
ラッパークラスの具体例のひとつに、int型に対するIntegerクラスが挙げられる。
Integerクラスはint型のラッパークラスとして機能し、int型が持たない「クラスとしての機能」を提供する。APIリファレンスには「The Integer class wraps a value of the primitive type int in an object.」と書かれており、この「wraps」が「覆い隠す」という意味になる。
プリミティブ型は、全ての型に対応するラッパークラスが存在する。
プリミティブ型に対応するラッパークラスは、以下の通り。
・byte → Byte
・short → Short
・int → Integer
・long → Long
・float → Float
・double → Double
・char → Character
・boolean → Boolean
これらのラッパークラスは「インスタンスは不変」なため、インスタンス内の値を変更することはできない。
この機能によって、ラッパークラスはよりプリミティブ型に近い扱いが可能となっている。
詳しくは「インスタンスは不変」の項目を参照。
また、オートボクシングによってプリミティブ型との変換が簡単にできるようになっている。詳しくは「ボクシング変換」「アンボクシング変換」の項目を参照。
これらはプリミティブ型にはない便利なメソッドを持ち、かつプリミティブ型が持たない「参照」を用いた処理を行うことができる。
特にこれはArrayListクラス等のコレクションを使用する場合に必要となる。コレクションクラスの要素はObjectクラスとなっているため、プリミティブ型を格納することができない。また、ジェネリッククラスやジェネリックメソッドの型パラメーター(「<T>」のこと)にもプリミティブ型を使用することができない。
そのため、コレクションの要素にプリミティブ型を使用したい場合には、その代わりに対応するラッパークラスを使用することになる。
また、ラッパークラスを使用することでプリミティブ型にはない「null」という状態を持つことができる。それにより、数値の入力を受け取る際に「入力なし」という状態を「null」で表現することができる。
「ラッパー」と言っても「Yo!」とか言う人達とは関係ないので注意。
意味的には「クレラップ」「サランラップ」の方が近い。
// Sample.java
import java.util.ArrayList;
public class Sample
{
public static void main( String[] args )
{
// Integerクラスは、int型を包み込む
// ラッパークラスです。
Integer integer = new Integer( 100 );
System.out.println( integer );
// 100
// 今作ったインスタンス内にint型のフィールドが
// 存在し、その中に整数値100が格納されています。
// このフィールドには直接アクセスできません。
// また、int型が持たない機能も提供しています。
// たとえば、中の値を元にハッシュコードを生成する
// hashCode()メソッドを持っています。
System.out.println( integer.hashCode() );
// 100
// J2SE 5.0以降はボクシング変換・アンボクシング変換が
// できるようになったので、プリミティブ型との相互変換が
// 簡単になりました。
// ボクシング変換を使ってプリミティブ型→ラッパークラス
// の変換をします。
integer = 200;
System.out.println( integer );
// 200
// アンボクシング変換を使ってラッパークラス→プリミティブ型
// の変換をします。
int i = integer;
System.out.println( i );
// 200
// Integerクラス等の、プリミティブ型のラッパークラスは
// 「null」という状態を持てます。
integer = null;
// これを使ってたとえば「未入力」を表現できたりします。
// また、ArrayListクラス等のコレクションは要素に
// プリミティブ型を使用できないため、代わりに
// ラッパークラスを使用する必要があります。
// ※コンパイルエラーの例
// ArrayList<int> array;
// ※エラーメッセージ
// トークン "int" に構文エラーがあります。
// このトークンの後には Dimensions を指定する必要があります
// ※コンパイルエラーの例ここまで
// というコンパイルエラーになるので、ラッパークラスを
// 使用します。
ArrayList<Integer> array = new ArrayList<Integer>();
array.add( new Integer( 100 ) );
array.add( new Integer( 200 ) );
array.add( new Integer( 300 ) );
for( int iF1 = 0; iF1 < array.size(); ++iF1 )
{
Integer e = array.get( iF1 );
System.out.print( e + ", " );
}
// 100, 200, 300,
}
}
import java.util.ArrayList;
public class Sample
{
public static void main( String[] args )
{
// Integerクラスは、int型を包み込む
// ラッパークラスです。
Integer integer = new Integer( 100 );
System.out.println( integer );
// 100
// 今作ったインスタンス内にint型のフィールドが
// 存在し、その中に整数値100が格納されています。
// このフィールドには直接アクセスできません。
// また、int型が持たない機能も提供しています。
// たとえば、中の値を元にハッシュコードを生成する
// hashCode()メソッドを持っています。
System.out.println( integer.hashCode() );
// 100
// J2SE 5.0以降はボクシング変換・アンボクシング変換が
// できるようになったので、プリミティブ型との相互変換が
// 簡単になりました。
// ボクシング変換を使ってプリミティブ型→ラッパークラス
// の変換をします。
integer = 200;
System.out.println( integer );
// 200
// アンボクシング変換を使ってラッパークラス→プリミティブ型
// の変換をします。
int i = integer;
System.out.println( i );
// 200
// Integerクラス等の、プリミティブ型のラッパークラスは
// 「null」という状態を持てます。
integer = null;
// これを使ってたとえば「未入力」を表現できたりします。
// また、ArrayListクラス等のコレクションは要素に
// プリミティブ型を使用できないため、代わりに
// ラッパークラスを使用する必要があります。
// ※コンパイルエラーの例
// ArrayList<int> array;
// ※エラーメッセージ
// トークン "int" に構文エラーがあります。
// このトークンの後には Dimensions を指定する必要があります
// ※コンパイルエラーの例ここまで
// というコンパイルエラーになるので、ラッパークラスを
// 使用します。
ArrayList<Integer> array = new ArrayList<Integer>();
array.add( new Integer( 100 ) );
array.add( new Integer( 200 ) );
array.add( new Integer( 300 ) );
for( int iF1 = 0; iF1 < array.size(); ++iF1 )
{
Integer e = array.get( iF1 );
System.out.print( e + ", " );
}
// 100, 200, 300,
}
}
// Sample.java
import java.util.ArrayList;
public class Sample
{
public static void main( String[] args )
{
// Integerクラスは、int型を包み込む
// ラッパークラスです。
Integer integer = new Integer( 100 );
System.out.println( integer );
// 100
// 今作ったインスタンス内にint型のフィールドが
// 存在し、その中に整数値100が格納されています。
// このフィールドには直接アクセスできません。
// また、int型が持たない機能も提供しています。
// たとえば、中の値を元にハッシュコードを生成する
// hashCode()メソッドを持っています。
System.out.println( integer.hashCode() );
// 100
// J2SE 5.0以降はボクシング変換・アンボクシング変換が
// できるようになったので、プリミティブ型との相互変換が
// 簡単になりました。
// ボクシング変換を使ってプリミティブ型→ラッパークラス
// の変換をします。
integer = 200;
System.out.println( integer );
// 200
// アンボクシング変換を使ってラッパークラス→プリミティブ型
// の変換をします。
int i = integer;
System.out.println( i );
// 200
// Integerクラス等の、プリミティブ型のラッパークラスは
// 「null」という状態を持てます。
integer = null;
// これを使ってたとえば「未入力」を表現できたりします。
// また、ArrayListクラス等のコレクションは要素に
// プリミティブ型を使用できないため、代わりに
// ラッパークラスを使用する必要があります。
// ※コンパイルエラーの例
// ArrayList<int> array;
// ※エラーメッセージ
// トークン "int" に構文エラーがあります。
// このトークンの後には Dimensions を指定する必要があります
// ※コンパイルエラーの例ここまで
// というコンパイルエラーになるので、ラッパークラスを
// 使用します。
ArrayList<Integer> array = new ArrayList<Integer>();
array.add( new Integer( 100 ) );
array.add( new Integer( 200 ) );
array.add( new Integer( 300 ) );
for( int iF1 = 0; iF1 < array.size(); ++iF1 )
{
Integer e = array.get( iF1 );
System.out.print( e + ", " );
}
// 100, 200, 300,
}
}




