JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 匿名クラスとは

匿名クラス

日本語 匿名階級
英語 anonymous inner class
ふりがな とくめいくらす
フリガナ トクメイクラス

解説

「その場限り」のサブクラスもしくは実装クラスを作る方法。
new スーパークラス( コンストラクタ引数 ) { /* サブクラスとしての実装 */ }」とすることで、「名前のない」クラスを作ることができる。これが「匿名クラス」である。
匿名クラスは「スーパークラス名」のサブクラスとして作られる。スーパークラスの代わりにインターフェイスを使用し、その実装クラスを作ることもできる。
 
逆に言うと、匿名クラスは必ず、スーパークラスサブクラスか、インターフェイス実装クラスとして作らなければならない。単独のクラスとして作る場合には、Objectクラスサブクラスとして作ることになる。
また、匿名クラスは「名前のないクラス」のため、参照変数を作ることができない。そのため、基本的に「オーバーライドするメソッド」もしくは「実装するメソッド」以外にpublicメソッドを作ることはない。新規に追加したpublicメソッドを外から呼ぶ方法がないためである。
つまり、匿名クラスは、サブクラスもしくは実装クラスを手っ取り早く作る方法であり、それ以外の目的に使うことは難しいということである。
 
たとえば、Arraysクラスのsort()メソッドで「降順ソート」をしたい場合にComparatorインターフェイス実装クラスを作る必要がある場合など、「他では使わず、その場でしか使わないサブクラスもしくは実装クラス」を作りたい場合がある。
このような、新しくちゃんとした形でクラスを作るのが面倒な場合に、匿名クラスを使用する。匿名クラスはその名の通り「名前がない」クラスであり、新しくファイルを作る必要がないなど、手軽に作れるというメリットがある。
 
ただし、匿名クラスはちゃんとしたクラスではないため、メソッドを追加できず、また再利用がしにくい。
構文が複雑でかっこいいこと、ソースファイルを新規に作らなくて済むこと、といったメリットがあるが、普通のクラスを作ることのメリットの方が遙かに多く、コピー&ペーストの多用やプログラムが複雑になりやすいといったデメリットも多い。
匿名クラスの使用は控え、よほどの事がない限り普通のクラスを使用した方がいいだろう。

参考サイト

  • (参考サイトはありません)

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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();
}
// 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();
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/10/27
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。