JavaA2Z

KAB-studio > プログラミング > JavaA2Z > Cloneableとは

Cloneable

日本語 複製可能
英語 cloneable
ふりがな くろーなぶる
フリガナ クローナブル

解説

J2SEに含まれるインターフェイスのひとつ。パッケージも含めたインターフェイス名はjava.lang.Cloneable。
「複製可能」であることを示すインターフェイス
 
メソッドはひとつも持たず、実装クラスオーバーライドする必要はない。
Cloneableインターフェイス実装する目的は、Objectクラスclone()メソッド呼び出すためである。
サブクラスからObjectクラスclone()メソッド呼び出すことで、そのサブクラスインスタンスを複製することができる。
ただし、Objectクラスclone()メソッドは、サブクラスがCloneableインターフェイス実装クラスでない場合、CloneNotSupportedException例外投げる
つまりObjectクラスclone()メソッドは、このメソッドが呼ばれることを証明するために、サブクラスにCloneableインターフェイス実装を強制する。Cloneableインターフェイスは、Objectクラスclone()メソッドを呼ぶ「印」である。

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

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

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        try
        {
            // DataUseSuperクラスの使用例。

            // 元インスタンスを作ります。
            DataUseSuper data = new DataUseSuper();
            data.setData( 100 );
            System.out.println( data.getData() );
            // 100

            // clone()メソッドで複製を作ります。
            DataUseSuper dataCloned = (DataUseSuper)data.clone();

            // 出力します。
            System.out.println( dataCloned.getData() );
            // 100
        }
        catch( CloneNotSupportedException e )
        {
            e.printStackTrace();
        }

        try
        {
            // DataNotCloneableImplementedクラスの使用例。

            // 元インスタンスを作ります。
            DataNotCloneableImplemented data = new DataNotCloneableImplemented();
            data.setData( 200 );
            System.out.println( data.getData() );
            // 200

            // clone()メソッドで複製を作ります。
            DataNotCloneableImplemented dataCloned = (DataNotCloneableImplemented)data.clone();
        }
        catch( CloneNotSupportedException e )
        {
            // DataNotCloneableImplementedクラスは、Cloneableインターフェイス
            // の実装クラスじゃないのに、Objectクラスのclone()メソッドで
            // 複製を作ろうとしたので、CloneNotSupportedException例外が投げられます。
            e.printStackTrace();
            // java.lang.CloneNotSupportedException: DataNotCloneableImplemented
            //     at java.lang.Object.clone(Native Method)
            //     at DataNotCloneableImplemented.clone(Sample.java:113)
            //     at Sample.main(Sample.java:39)
        }
    }
}

/**
*   Objectクラスのclone()メソッドをオーバーライドして、
*   Objectクラスのclone()メソッドを使用して複製を作ります。
*/
class DataUseSuper implements Cloneable
{
    private int data;

    public void setData( int i )
    {
        data = i;
    }

    public int getData()
    {
        return data;
    }

    /**
    *   Objectクラスのclone()メソッドをオーバーライドします。
    */
    protected Object clone() throws CloneNotSupportedException
    {
        // Objectクラスのclone()メソッドで複製を作ります。
        // Cloneableインターフェイスの実装クラスでないと
        // CloneNotSupportedException例外が投げられます。
        return super.clone();
    }
}

/**
*   Objectクラスのclone()メソッドをオーバーライドして、
*   Objectクラスのclone()メソッドを使用して複製を作ります。
*   ただし、Cloneableインターフェイスの実装クラスでは
*   ありません(つまり間違った例です)。
*/
class DataNotCloneableImplemented
{
    private int data;

    public void setData( int i )
    {
        data = i;
    }

    public int getData()
    {
        return data;
    }

    /**
    *   Objectクラスのclone()メソッドをオーバーライドします。
    */
    protected Object clone() throws CloneNotSupportedException
    {
        // Objectクラスのclone()メソッドで複製を作ります。
        // でも、Cloneableインターフェイスの実装クラスではないので
        // CloneNotSupportedException例外が投げられます。
        return super.clone();
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        try
        {
            // DataUseSuperクラスの使用例。

            // 元インスタンスを作ります。
            DataUseSuper data = new DataUseSuper();
            data.setData( 100 );
            System.out.println( data.getData() );
            // 100

            // clone()メソッドで複製を作ります。
            DataUseSuper dataCloned = (DataUseSuper)data.clone();

            // 出力します。
            System.out.println( dataCloned.getData() );
            // 100
        }
        catch( CloneNotSupportedException e )
        {
            e.printStackTrace();
        }

        try
        {
            // DataNotCloneableImplementedクラスの使用例。

            // 元インスタンスを作ります。
            DataNotCloneableImplemented data = new DataNotCloneableImplemented();
            data.setData( 200 );
            System.out.println( data.getData() );
            // 200

            // clone()メソッドで複製を作ります。
            DataNotCloneableImplemented dataCloned = (DataNotCloneableImplemented)data.clone();
        }
        catch( CloneNotSupportedException e )
        {
            // DataNotCloneableImplementedクラスは、Cloneableインターフェイス
            // の実装クラスじゃないのに、Objectクラスのclone()メソッドで
            // 複製を作ろうとしたので、CloneNotSupportedException例外が投げられます。
            e.printStackTrace();
            // java.lang.CloneNotSupportedException: DataNotCloneableImplemented
            //     at java.lang.Object.clone(Native Method)
            //     at DataNotCloneableImplemented.clone(Sample.java:113)
            //     at Sample.main(Sample.java:39)
        }
    }
}

/**
*   Objectクラスのclone()メソッドをオーバーライドして、
*   Objectクラスのclone()メソッドを使用して複製を作ります。
*/
class DataUseSuper implements Cloneable
{
    private int data;

    public void setData( int i )
    {
        data = i;
    }

    public int getData()
    {
        return data;
    }

    /**
    *   Objectクラスのclone()メソッドをオーバーライドします。
    */
    protected Object clone() throws CloneNotSupportedException
    {
        // Objectクラスのclone()メソッドで複製を作ります。
        // Cloneableインターフェイスの実装クラスでないと
        // CloneNotSupportedException例外が投げられます。
        return super.clone();
    }
}

/**
*   Objectクラスのclone()メソッドをオーバーライドして、
*   Objectクラスのclone()メソッドを使用して複製を作ります。
*   ただし、Cloneableインターフェイスの実装クラスでは
*   ありません(つまり間違った例です)。
*/
class DataNotCloneableImplemented
{
    private int data;

    public void setData( int i )
    {
        data = i;
    }

    public int getData()
    {
        return data;
    }

    /**
    *   Objectクラスのclone()メソッドをオーバーライドします。
    */
    protected Object clone() throws CloneNotSupportedException
    {
        // Objectクラスのclone()メソッドで複製を作ります。
        // でも、Cloneableインターフェイスの実装クラスではないので
        // CloneNotSupportedException例外が投げられます。
        return super.clone();
    }
}

この単語を含むページ

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

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

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

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