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




