marker interface java
このチュートリアルでは、Javaのマーカーインターフェイスとは何かについて説明します。また、コード例を使用して、Javaでのシリアル化の逆シリアル化とクローン作成についても説明します。
最後のトピックについては、インターフェイス、つまりJavaのマーカーインターフェイスで説明します。
マーカーインターフェイスの使用が終了したら、Javaのシリアル化可能インターフェイスとクローン可能インターフェイスの2つの例について説明します。マーカーインターフェースから始めましょう。
=> ゼロからJavaを学ぶには、こちらにアクセスしてください
学習内容:
Javaのマーカーインターフェイス
Javaのマーカーインターフェイスは、フィールドやメソッドを持たない空のインターフェイスです。このマーカーインターフェイスは、マーカーインターフェイスを実装するクラスのオブジェクトが異なり、それらを異なる方法で処理する必要があることをコンパイラに通知します。
Javaで配列を呼び出す方法
Javaの各マーカーインターフェイスは、JVMまたはコンパイラに特別な何かを表すことを示しています。
Javaには、以下に示すように、マーカーインターフェイスである3つのインターフェイスがあります。
#1)シリアル化可能なインターフェイス: Serializableは、java.ioパッケージに存在するマーカーインターフェイスです。このインターフェースを使用してオブジェクトをシリアル化できます。つまり、オブジェクトの状態をファイルに保存します。
#2)クローン可能なインターフェース: 複製可能なインターフェースはjava.langパッケージの一部であり、オブジェクトの複製を可能にします。
#3)リモートインターフェース: リモートインターフェースはjava.RMIパッケージの一部であり、このインターフェースを使用してRMIアプリケーションを作成します。このインターフェースは主にリモートオブジェクトを扱います。
このチュートリアルでは、シリアライズ可能でクローン可能なインターフェイスについて説明します。 JavaのRMIに移行するときに、リモートインターフェイスについて説明します。
Javaでのシリアル化
JavaのSerializableインターフェースの詳細に入る前に、Javaのシリアル化と逆シリアル化のプロセスを理解しましょう。
シリアル化は、オブジェクトの状態を同等のバイトストリームに変換して、オブジェクトをメモリまたはメモリに格納するプロセスとして定義できます。 持続する オブジェクト。
保存された状態からオブジェクトを取得してその内容にアクセスする場合、バイトストリームを実際のJavaオブジェクトに変換し直す必要があります。このプロセスは、逆シリアル化と呼ばれます。
このように、Javaアプリケーションの存続期間中にJavaオブジェクトをシリアル化/逆シリアル化する必要がある場合が多くあります。
シリアル化/逆シリアル化のプロセスを以下に示します。
上に示したように、シリアル化はオブジェクトをストリームに変換します。デシリアライズは、バイトストリームをJavaオブジェクトに変換し直します。
シリアル化と逆シリアル化のメカニズム全体は、プラットフォームに依存しません。これは、あるプラットフォームでオブジェクトをシリアル化してから、別のプラットフォームで逆シリアル化できることを意味します。
Javaオブジェクトをシリアル化したということは、ObjectOutputStreamメソッドwriteObject()を呼び出してオブジェクトをファイルに書き込んだことを意味します。
public final void writeObect(Object obj)はIOExceptionをスローします
同様に、逆シリアル化の場合、ObjectInputStream :: readObject()メソッドを呼び出して、オブジェクトを格納しているファイルからデータを読み取ります。
public final Object readObject()はIOException、ClassNotFoundExceptionをスローします
Javaシリアル化可能なインターフェイス
Javaは、Javaでシリアル化と逆シリアル化を実装できる「serializable」という名前のインターフェースを提供します。
シリアライズ可能なインターフェースはjava.ioパッケージの一部です。これは、メソッドやメンバーを持たない、上記で説明したマーカーインターフェイスの例です。シリアライズ可能なインターフェースは、Javaクラスを「マーク」して、これらのクラスのオブジェクトがそれ自体を永続化できるようにします。
したがって、オブジェクトを永続化する必要があるクラスは、Serializableインターフェイスを実装する必要があります。次に、このクラスのオブジェクト(Serializableインターフェイスの実装)は、クラスオブジェクトのシリアル化と逆シリアル化にそれぞれwriteObject()メソッドとreadObject()メソッドを使用します。
すべてのラッパークラスとStringクラスは、デフォルトでjava.io.Serializableを実装していることに注意してください。
オブジェクトが正常にシリアル化されるには、次の条件を満たす必要があります。
- オブジェクトがシリアル化されるクラスは、java.io.Serializableインターフェースを実装する必要があります。
- クラスのすべてのメンバーフィールドはシリアル化可能である必要があります。特定のフィールドがシリアル化できない場合は、一時的なものとしてマークする必要があります。
逆に、クラスはjava.io.Serializableインターフェイスを実装している場合にのみシリアライズ可能であり、それ以外の場合はシリアライズできません。
Javaでオブジェクトをシリアル化および逆シリアル化する方法
Javaでオブジェクトをシリアル化するときは、objectOutputStreamのwriteObjectメソッドを使用してオブジェクトをファイルに書き込みます。
Javaでオブジェクトを逆シリアル化するために、ObjectInputStreamのreadObject()メソッドを使用してファイルの内容を読み取り、それらをオブジェクトに読み込みます。
この例では、 Serializableインターフェースを実装するStudentクラスがあります。これは、Studentクラスのオブジェクトをシリアル化または逆シリアル化できることを意味します。
Javaプログラムのmainメソッドで、Studentクラスオブジェクトを作成します。次に、FileOutputStreamオブジェクトを指すObjectOutputStreamを作成します。このオブジェクトは、Studentオブジェクトを書き込む必要のあるファイルを指します。次に、オブジェクトをファイルに書き込むwriteObject()メソッドを呼び出します。
指定されたオブジェクトを指定されたファイルに正常に書き込むと、プログラムは適切な出力メッセージを表示します。次に、上記のプロセスを逆にして、オブジェクトを逆シリアル化します。まず、内容を読み取るファイルを読み取るObjectOutputStreamオブジェクトを作成します。
次に、readObject()メソッドを使用してコンテンツを読み取り、Studentオブジェクトにキャストします。次に、Studentオブジェクトの内容を出力します。
シリアル化/逆シリアル化の例
次のJavaプログラムは、上記で説明したJavaのシリアル化/逆シリアル化メカニズムを示しています。
import java.io.*; import java.io.Serializable; //Class Student implements class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of student class Student s1 =new Student(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); //Create a stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('Eddie.txt')); Student s=(Student)in.readObject(); //print the data of the deserialized object System.out.println('Student object: ' + s.id+' '+s.name); //close the stream in.close(); }catch(Exception e){System.out.println(e);} } }
出力:
デシリアライズ後、同じファイルを再度開くと、以前にシリアル化したものと同じオブジェクトが取得されることに注意してください。
Java一時キーワード
一時的なキーワードは、データメンバーを一時的なものにするために使用されます。つまり、シリアル化する必要はありません。
例えば、 次のクラスの従業員を検討してください。ここには、他のフィールドとともに従業員IDフィールドがあります。ここで、従業員IDフィールドをシリアル化しないと決定した場合は、「一時的」として宣言します。
Javaプログラムの例を以下に示します。
import java.io.*; class Employee implements Serializable{ transient int id; String name; public Employee(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of Employee class Employee s1 =new Employee(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); //Create a stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('Eddie.txt')); Employee s=(Employee)in.readObject(); //print the data of the deserialized object System.out.println('Employee object: ' + s.id+' '+s.name); //close the stream in.close(); }catch(Exception e){System.out.println(e);} } }
出力:
上記のプログラムでは、Employeeオブジェクトをシリアル化しました。ただし、EmployeeクラスのEmployeeidフィールドは「一時的」と宣言されていることに注意してください。次に、シリアル化を確認するために、オブジェクトを逆シリアル化します。出力には、Employeeオブジェクトが「0Eddie」として表示されます。これは、従業員IDがファイルに保存されなかったことを意味します。
JavaのJava.io.NotSerializableException
java.io.NotSerializableExceptionの例外は、クラスがシリアル化に適格でない場合にスローされる例外です。 Serializableインターフェイスを実装していないクラスは、シリアル化の対象外になります。
以下のJavaプログラムは、NotSerializableExceptionを示しています。
import java.io.*; class Employee { transient int id; String name; public Employee(int id, String name) { this.id = id; this.name = name; } } class Main{ public static void main(String args()){ try{ //Create the object of Employee class Employee s1 =new Employee(27,'Eddie'); //Write the object to the stream by creating a output stream FileOutputStream fout=new FileOutputStream('Eddie.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //close the stream out.close(); System.out.println('Object successfully written to the file'); }catch(Exception e){System.out.println(e);} } }
出力:
上記のプログラムからわかるように、EmployeeクラスはSerializableインターフェースを実装していません。したがって、Employeeクラスオブジェクトをシリアル化しようとすると、NotSerializableExceptionがスローされます。
Javaでのクローン可能なインターフェイス
オブジェクトのクローン作成とは、オブジェクトのコピーを作成することを意味します。 Javaは、「 クローン可能 ' インターフェース。クローン可能インターフェースはマーカーインターフェースであり、java.langパッケージの一部です。
クラスがCloneableインターフェースを実装する場合、それはこのクラスのオブジェクトを複製できることを意味します。 JavaのObjectクラスには、「 クローン ()' 方法。したがって、特定のクラスによって実装されたCloneableインターフェイスは、clone()メソッドがクラスインスタンスのコピーを作成することを許可します。
クラスがCloneableインターフェースを実装せず、それでもclone()メソッドを呼び出す場合、例外 CloneNotSupportedException Javaコンパイラによってスローされます。
Cloneableインターフェースを実装するクラスは、clone()メソッドをオーバーライドする必要があります。
では、オブジェクトクローニングとは何ですか?
オブジェクトのクローン作成は、Objectクラスのclone()メソッドを使用してオブジェクトの正確なコピーを作成するプロセスです。 clone()メソッドをオーバーライドして呼び出すには、クラスがCloneableインターフェイスを実装する必要があります。
clone()メソッドの一般的な構文を以下に示します。
保護 オブジェクトclone() 投げる CloneNotSupportedException
clone()メソッドは、newキーワードを使用して新しいオブジェクトを作成する場合よりも短い処理時間で、オブジェクトの正確なコピーを作成します。
以下のJavaプログラムは、clone()メソッドとCloneableインターフェースの使用法を示しています。
class Student implements Cloneable{ int rollno; String name; //class constructor Student(int rollno,String name){ this.rollno=rollno; this.name=name; } //clone method public Object clone()throws CloneNotSupportedException{ return super.clone(); } } class Main{ public static void main(String args()){ try{ Student s1=new Student(101,'Lissa'); //clone the s1 object Student s2=(Student)s1.clone(); System.out.println('Original Student object: ' + s1.rollno+' '+s1.name); System.out.println('Cloned Student object: ' + s2.rollno+' '+s2.name); }catch(CloneNotSupportedException c){} } }
出力:
このプログラムには、Cloneableインターフェースを実装するStudentクラスがあります。また、super.clone()メソッドを呼び出すことにより、clone()メソッドをオーバーライドします。 mainメソッドで、新しいStudentオブジェクトを作成し、このオブジェクトでclone()メソッドを呼び出して、新しいStudentオブジェクトを返します。
Javaで配列をクローンする
配列に関するチュートリアルでは、配列のクローン作成について説明しました。 Java配列はデフォルトでクローン可能インターフェースを実装しているため、明示的に実装する必要はありません。 1次元配列が複製されると、配列のディープコピーが生成されます。 2次元配列が複製されると、浅いコピーが作成されます。
浅いコピーの作成は、Javaのclone()メソッドのデフォルトの動作です。しかし、ほとんどの場合、ディープクローニングが必要です。ディープクローン作成では、メンバーごとにオブジェクトのコピーを作成し、元のオブジェクトから独立したクローンを作成します。その後、クローンオブジェクトに加えられた変更は、元のオブジェクトには反映されません。
次のJavaプログラムは、1次元配列の複製を示しています。
class Main { public static void main(String args()) { //define an array int intArray() = {2,6,3,7,1,8}; //invoke clone () method on intArray int cloneArray() = intArray.clone(); //print the arrays. System.out.println('Original intArray:'); for (int i = 0; i 出力:

Javaのクローンリスト
以下のプログラムは、clone()メソッドを使用してJavaでリストを複製する方法を示しています。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; // MyList Class implementing cloneable class MyList implements Cloneable { String name1; String name2; // Constructor MyList(String name1, String name2) { this.name1 = name1; this.name2 = name2; } // To print the objects in the desired format @Override public String toString() { return 'Hello ' + name1 + ',' + name2 + '
' ; } // Overriding the clone method @Override protected MyList clone() { return new MyList(name1 , name2); } } class Main { public static void main(String() args) { // Create a list List original = Arrays.asList( new MyList('Sydney','Rose'), new MyList('Joe','Ian')); // Create an empty list List cloned_list = new ArrayList(); // Loop through the list and clone each element for (MyList temp : original) cloned_list.add(temp.clone()); System.out.print(cloned_list); } }
出力:

上記のプログラムでは、Cloneableインターフェイスを実装するMyListクラスを作成したことがわかります。このクラス内で、Listのクローンを作成するのに役立つclone()メソッドをオーバーライドします。 mainメソッドでは、要素のリストを作成し、リストを反復処理してリストの各要素のクローンを作成します。
よくある質問
Q#1)Javaでのマーカーインターフェイスの使用は何ですか?
回答: 「タグ付きインターフェイス」とも呼ばれるマーカーインターフェイスは、クラスにタグを付け、このクラスが特別な動作を実装する可能性があることをコンパイラに通知します。
Q#2)Javaのすべてのマーカーインターフェイスは何ですか?
回答: Serializable、Cloneable、およびRemoteは、Javaのマーカーインターフェイスの例であるインターフェイスです。
Q#3)なぜマーカーインターフェイスをシリアル化できるのですか?
回答: シリアル化可能なインターフェイスには、メソッドやメンバー変数はありません。これは、マーカーインターフェイスとして分類する空のインターフェイスです。
Q#4)実行可能なマーカーインターフェイスはありますか?
回答: いいえ、runnableはマーカーインターフェイスではありません。実行可能なインターフェイスは空ではなく、その中にrun()メソッド宣言を提供します。
Q#5)なぜクローン可能なインターフェースを実装する必要があるのですか?
回答: クラスに複製可能なインターフェイスを実装することにより、Objectクラスのclone()メソッドを使用してこのクラスのオブジェクトを複製できることを示します。 clone()メソッドを使用するクラスがクローン可能なインターフェイスを実装していない場合、例外「CloneNotSupportedException」がスローされます。
結論
このチュートリアルで、Javaのインターフェイスに関する説明を完了しました。インターフェイスの概念、その構造、定義、使用法などについても説明しました。また、Comparable、Comparator、MarkerインターフェイスなどのJavaの重要なインターフェイスのいくつかについても説明しました。
このチュートリアルでは、マーカーインターフェイスの2つの例、つまりシリアル化可能とクローン可能について説明しました。シリアル化可能なインターフェイスは、オブジェクトを永続化するために使用されます。クローン可能インターフェイスは、クラスオブジェクトのクローンを作成するために使用されます。これらのインターフェースは両方ともマーカーインターフェースです。つまり、空です。
しかし、クラスがそれらを実装するとき、それらは、コンパイラーがそれらを実装するクラスからいくつかの特別な動作を期待できることを示します。
例えば、 クラスがSerializableインターフェイスを実装すると、クラスオブジェクトをシリアル化または逆シリアル化し、それらの状態を保存/取得できます。
複製可能なインターフェースを実装するクラスは、このクラスのオブジェクトを複製できることを示しています。 clone()メソッドのデフォルトの実装では、オブジェクトの浅いコピーが作成されますが、clone()メソッドをオーバーライドして深いコピーを作成できます。
=> ここで完全なJavaトレーニングシリーズをご覧ください
推奨読書