匿名クラス
日本語 | 匿名階級 |
英語 | anonymous inner class |
ふりがな | とくめいくらす |
フリガナ | トクメイクラス |
「その場限り」のサブクラスもしくは実装クラスを作る方法。
「new スーパークラス名( コンストラクタの引数 ) { /* サブクラスとしての実装 */ }」とすることで、「名前のない」クラスを作ることができる。これが「匿名クラス」である。
匿名クラスは「スーパークラス名」のサブクラスとして作られる。スーパークラスの代わりにインターフェイスを使用し、その実装クラスを作ることもできる。
逆に言うと、匿名クラスは必ず、スーパークラスのサブクラスか、インターフェイスの実装クラスとして作らなければならない。単独のクラスとして作る場合には、Objectクラスのサブクラスとして作ることになる。
また、匿名クラスは「名前のないクラス」のため、参照型変数を作ることができない。そのため、基本的に「オーバーライドするメソッド」もしくは「実装するメソッド」以外にpublicメソッドを作ることはない。新規に追加したpublicメソッドを外から呼ぶ方法がないためである。
つまり、匿名クラスは、サブクラスもしくは実装クラスを手っ取り早く作る方法であり、それ以外の目的に使うことは難しいということである。
たとえば、Arraysクラスのsort()メソッドで「降順ソート」をしたい場合にComparatorインターフェイスの実装クラスを作る必要がある場合など、「他では使わず、その場でしか使わないサブクラスもしくは実装クラス」を作りたい場合がある。
このような、新しくちゃんとした形でクラスを作るのが面倒な場合に、匿名クラスを使用する。匿名クラスはその名の通り「名前がない」クラスであり、新しくファイルを作る必要がないなど、手軽に作れるというメリットがある。
ただし、匿名クラスはちゃんとしたクラスではないため、メソッドを追加できず、また再利用がしにくい。
構文が複雑でかっこいいこと、ソースファイルを新規に作らなくて済むこと、といったメリットがあるが、普通のクラスを作ることのメリットの方が遙かに多く、コピー&ペーストの多用やプログラムが複雑になりやすいといったデメリットも多い。
匿名クラスの使用は控え、よほどの事がない限り普通のクラスを使用した方がいいだろう。
「new スーパークラス名( コンストラクタの引数 ) { /* サブクラスとしての実装 */ }」とすることで、「名前のない」クラスを作ることができる。これが「匿名クラス」である。
匿名クラスは「スーパークラス名」のサブクラスとして作られる。スーパークラスの代わりにインターフェイスを使用し、その実装クラスを作ることもできる。
逆に言うと、匿名クラスは必ず、スーパークラスのサブクラスか、インターフェイスの実装クラスとして作らなければならない。単独のクラスとして作る場合には、Objectクラスのサブクラスとして作ることになる。
また、匿名クラスは「名前のないクラス」のため、参照型変数を作ることができない。そのため、基本的に「オーバーライドするメソッド」もしくは「実装するメソッド」以外にpublicメソッドを作ることはない。新規に追加したpublicメソッドを外から呼ぶ方法がないためである。
つまり、匿名クラスは、サブクラスもしくは実装クラスを手っ取り早く作る方法であり、それ以外の目的に使うことは難しいということである。
たとえば、Arraysクラスのsort()メソッドで「降順ソート」をしたい場合にComparatorインターフェイスの実装クラスを作る必要がある場合など、「他では使わず、その場でしか使わないサブクラスもしくは実装クラス」を作りたい場合がある。
このような、新しくちゃんとした形でクラスを作るのが面倒な場合に、匿名クラスを使用する。匿名クラスはその名の通り「名前がない」クラスであり、新しくファイルを作る必要がないなど、手軽に作れるというメリットがある。
ただし、匿名クラスはちゃんとしたクラスではないため、メソッドを追加できず、また再利用がしにくい。
構文が複雑でかっこいいこと、ソースファイルを新規に作らなくて済むこと、といったメリットがあるが、普通のクラスを作ることのメリットの方が遙かに多く、コピー&ペーストの多用やプログラムが複雑になりやすいといったデメリットも多い。
匿名クラスの使用は控え、よほどの事がない限り普通のクラスを使用した方がいいだろう。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// 匿名クラスを作ります。
OutputInterface outputInterface
= new OutputInterface()
{
/**
* output()メソッドを実装します。
*/
public void output()
{
System.out.println( "あいうえお" );
}
};
// ポリモーフィズムを使って、匿名クラスで
// 実装したoutput()メソッドを呼び出します。
outputInterface.output();
// あいうえお
// 匿名クラスの参照型変数は作れません。
// 上記の例で作った匿名クラスの参照型変数は作れないため、
// オーバーライドではないpublicメソッドを作って、それを
// 外から呼び出すことはできません。
// 一応、作った直後なら呼び出せます。
new Object()
{
/**
* Objectクラスに存在しないメソッドを作ります。
*/
public void output()
{
System.out.println( "かきくけこ" );
}
}.output();
// かきくけこ。
// でも、この匿名クラスの参照を入れる参照型変数は
// 作れないため、「直後以外」では呼び出せません。
// もっとも、普通にクラスを作ればいいだけの話ですが。
}
}
/**
* インターフェイス。
*/
interface OutputInterface
{
/**
* 実装用メソッド。
*/
public void output();
}
public class Sample
{
public static void main( String[] args )
{
// 匿名クラスを作ります。
OutputInterface outputInterface
= new OutputInterface()
{
/**
* output()メソッドを実装します。
*/
public void output()
{
System.out.println( "あいうえお" );
}
};
// ポリモーフィズムを使って、匿名クラスで
// 実装したoutput()メソッドを呼び出します。
outputInterface.output();
// あいうえお
// 匿名クラスの参照型変数は作れません。
// 上記の例で作った匿名クラスの参照型変数は作れないため、
// オーバーライドではないpublicメソッドを作って、それを
// 外から呼び出すことはできません。
// 一応、作った直後なら呼び出せます。
new Object()
{
/**
* Objectクラスに存在しないメソッドを作ります。
*/
public void output()
{
System.out.println( "かきくけこ" );
}
}.output();
// かきくけこ。
// でも、この匿名クラスの参照を入れる参照型変数は
// 作れないため、「直後以外」では呼び出せません。
// もっとも、普通にクラスを作ればいいだけの話ですが。
}
}
/**
* インターフェイス。
*/
interface OutputInterface
{
/**
* 実装用メソッド。
*/
public void output();
}
// Sample.java public class Sample { public static void main( String[] args ) { // 匿名クラスを作ります。 OutputInterface outputInterface = new OutputInterface() { /** * output()メソッドを実装します。 */ public void output() { System.out.println( "あいうえお" ); } }; // ポリモーフィズムを使って、匿名クラスで // 実装したoutput()メソッドを呼び出します。 outputInterface.output(); // あいうえお // 匿名クラスの参照型変数は作れません。 // 上記の例で作った匿名クラスの参照型変数は作れないため、 // オーバーライドではないpublicメソッドを作って、それを // 外から呼び出すことはできません。 // 一応、作った直後なら呼び出せます。 new Object() { /** * Objectクラスに存在しないメソッドを作ります。 */ public void output() { System.out.println( "かきくけこ" ); } }.output(); // かきくけこ。 // でも、この匿名クラスの参照を入れる参照型変数は // 作れないため、「直後以外」では呼び出せません。 // もっとも、普通にクラスを作ればいいだけの話ですが。 } } /** * インターフェイス。 */ interface OutputInterface { /** * 実装用メソッド。 */ public void output(); }