logo

Javaのマーカーインターフェース

このセクションでは、について説明します。 Javaのマーカーインターフェース 、 その 使用、組み込み ( シリアル化可能クローン可能 、およびリモート インターフェイス) そして カスタムマーカーインターフェース 例とともに。

マーカーインターフェースとは何ですか?

アン インターフェース メソッド、フィールド、定数を含まないものは、 マーカーインターフェイス 。言い換えれば、空のインターフェイスは次のように呼ばれます。 マーカーインターフェイス または タグインターフェイス。 オブジェクトに関する実行時の型情報を提供します。その理由は、 JVM およびコンパイラはオブジェクトに関する追加情報を持っています。の シリアル化可能 そして クローン可能 インターフェイスはマーカー インターフェイスの例です。つまり、JVM への信号またはコマンドを示します。

マーカー インターフェイスの宣言は Java のインターフェイスと同じですが、インターフェイスは空である必要があります。例えば:

文字列をjsonオブジェクトに変換する
 public interface Serializable { } 

マーカー インターフェイスと同じ結果を生成するマーカー インターフェイスには 2 つの選択肢があります。

    内部フラグ:マーカー インターフェイスの代わりに使用して、特定の操作を示すことができます。注釈:Java5以降、 マーカーインターフェイスは省略されています 。 Java 5 では、マーカー インターフェイスの代わりに、 注釈 同じ結果を達成するために。これにより、柔軟なメタデータ機能が可能になります。したがって、任意のクラスにアノテーションを適用することで、特定のアクションを実行できます。

マーカーインターフェイスの使用

マーカー インターフェイスは、Java コンパイラを実装するクラスに特別な動作を追加できるように、メッセージによって Java コンパイラに通知するタグとして使用されます。 Java マーカー インターフェイスは、クラスに関する情報があり、その情報が決して変更されない場合に便利です。そのような場合、同じものを表すためにマーカー インターフェイスを使用します。空のインターフェイスを実装すると、コンパイラにいくつかの操作を実行するように指示します。

これはコードを論理的に分割するために使用され、コードを分類する良い方法です。 API の開発や Spring などのフレームワークでより便利です。

内蔵マーカーインターフェース

ジャワ 、組み込みマーカー インターフェイスは、JDK にすでに存在し、すぐに使用できるインターフェイスです。多くの組み込みマーカー インターフェイスがあり、その一部を次に示します。

  • クローン可能なインターフェース
  • シリアル化可能なインターフェイス
  • リモートインターフェース

一つずつ詳しく説明していきます。

クローン可能なインターフェース

掃除可能なインターフェイス Java の も、以下に属するマーカー インターフェイスです。 java.lang パッケージ。別の名前のオブジェクトのレプリカ (コピー) を生成します。クローンを作成するクラス オブジェクトのクラスにインターフェイスを実装できます。それは、 クローン() オブジェクトクラスのメソッド。クラスに Cloneable インターフェイスを実装せずに clone() メソッドを呼び出すと、 ClassNotSupportedException。

Cloneable インターフェイスを実装するクラスは、 public メソッドで clone() メソッドをオーバーライドする必要があることに注意してください。例を見てみましょう。

製品.java

 import java.util.Scanner; public class Product implements Cloneable { int pid; String pname; double pcost; //Product class constructor public Product (int pid, String pname, double pcost) { this.pid = pid; this.pname = pname; this.pcost = pcost; } //method that prints the detail on the console public void showDetail() { System.out.println('Product ID: '+pid); System.out.println('Product Name: '+pname); System.out.println('Product Cost: '+pcost); } public static void main (String args[]) throws CloneNotSupportedException { //reading values of the product from the user Scanner sc = new Scanner(System.in); System.out.print('Enter product ID: '); int pid = sc.nextInt(); System.out.print('Enter product name: '); String pname = sc.next(); System.out.print('Enter product Cost: '); double pcost = sc.nextDouble(); System.out.println('-------Product Detail--------'); Product p1 = new Product(pid, pname, pcost); //cloning the object of the Product class using the clone() method Product p2 = (Product) p1.clone(); //invoking the method to print detail p2.showDetail(); } } 

出力:

文字列Javaの文字列を置き換えます
 Enter product ID: 139872 Enter product name: Printer Enter product Cost: 3459.67 -------Product Detail-------- Product ID: 139872 Product Name: Printer Product Cost: 3459.67 

シリアル化可能なインターフェイス

で定義されている Java のマーカー インターフェイスです。 java.io パッケージ。クラスをシリアル化可能にしたい場合は、 シリアル化可能 インターフェース。クラスが Serializable インターフェイスを実装している場合、そのクラスのオブジェクトの状態をシリアル化または逆シリアル化できます。

シリアル化 (オブジェクトをバイト ストリームに変換する) は、 オブジェクトの状態はメモリから読み取られ、ファイルまたはデータベースに書き込まれます。 。逆シリアル化 (バイト ストリームをオブジェクトに変換する) は、シリアル化の逆であり、次のことを意味します。 オブジェクトの状態をファイルまたはデータベースから読み取り、メモリに書き戻す オブジェクトの逆シリアル化と呼ばれます。

Javaのマーカーインターフェース

シリアライゼーション(書き込み)は、 オブジェクト出力ストリーム クラスと逆シリアル化 (読み取り) は、 オブジェクト入力ストリーム クラス。

シリアル化と逆シリアル化の例を見てみましょう。

シリアル化の例

従業員.java

 import java.io.Serializable; public class Employee implements Serializable { int empid; String empname; public Employee(int empid, String empname) { this.empid = empid; this.empname = empname; } } 

SerializationExample.java

 import java.io.*; class SerializationExample { public static void main(String args[]) { try { //Creating the object Employee emp =new Employee(1187345,'Andrew'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('employee data.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(emp); out.flush(); //closing the stream out.close(); System.out.println('Data has been read from the file.'); } catch(Exception e) { e.printStackTrace(); } } } 

出力:

 Data has been read from the file. 

デシリアライズの例

オブジェクトの状態を逆シリアル化しましょう。

DeserializationExample.java

 import java.io.*; class DeserializationExample { public static void main(String args[]) { try { //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('employee data.txt')); Employee emp=(Employee)in.readObject(); //printing the data of the serialized object System.out.println(emp.empid+' '+emp.empname); //closing the stream in.close(); } catch(Exception e) { e.printStackTrace(); } } } 

出力:

 1187345 Andrew 

リモートインターフェース

リモートインターフェース に属するマーカー インターフェイスです。 java.rmi パッケージ。オブジェクトを、別のマシン (ホスト) からアクセスできるリモートとしてマークします。オブジェクトをリモートとして作成したい場合は、Remote インターフェイスを実装する必要があります。これは、非ローカル JVM からメソッドを呼び出すことができるインターフェイスを識別します。すべてのリモート オブジェクトは、インターフェイスを直接または間接的に実装する必要があります。

リモート インターフェイスを定義し、Java プログラムに実装してみましょう。

リモートインターフェースの定義

 import java.rmi.*; public interface AddAll extends Remote { public int add(int r, int s)throws RemoteException; } 

リモートインターフェースの実装

リモート インターフェイスを実装するには、次の 2 つの方法があります。

  • UnicastRemoteObject クラスを拡張することによって
  • UnicastRemoteObject クラスの exportObject() メソッドを使用する

AddAllRemote.java

 import java.rmi.*; import java.rmi.server.*; public class AddAllRemote extends UnicastRemoteObject implements Adder { AddAllRemote()throws RemoteException { super(); } public int add(int r, int s) { return r+s; } 

リモート アプリケーションを作成して起動する

サーバー.java

 import java.rmi.*; import java.rmi.registry.*; public class Server { public static void main(String args[]) { try { AddAll stub=new AddAllRemote(); Naming.rebind('rmi://localhost:5000/sak',stub); } catch(Exception e) { System.out.println(e); } } } 

クライアントアプリケーションを作成して起動する

クライアント.java

 import java.rmi.*; public class Client { public static void main(String args[]) { try { AddAll stub=(AddAll)Naming.lookup('rmi://localhost:5000/sak'); System.out.println(stub.add(29,18)); } catch(Exception e) { } } } 

カスタムマーカーインターフェース

組み込みのマーカー インターフェイスとは別に、Java では独自のマーカー インターフェイスを作成することもできます。例を見てみましょう。

CustomMarkerInterfaceExample.java

レジスタメモリ
 //custom marker interface interface Car { } //custom marker interface interface Engine { } //class that implements the Car marker interface class Vehicle implements Car { static void isVehicle() { System.out.println('Car is a vehicle.'); } } //class that implements the Engine marker interface class Status implements Engine { static void isWorking() { System.out.println('Yes, engine is working.'); } } //main class public class CustomMarkerInterfaceExample { public static void main(String args[]) { //invoking the methods of the class Vehicle.isVehicle(); Status.isWorking(); } } 

出力:

 Car is a vehicle. Yes, engine is working.