В този раздел ще обсъдим за маркерен интерфейс в Java , неговото използва, вграден ( Може да се сериализира , Може да се клонира и отдалечени интерфейси) и персонализиран интерфейс на маркера с примери.
Какво е маркерен интерфейс?
Ан интерфейс който не съдържа методи, полета и константи е известен като маркерен интерфейс . С други думи, празен интерфейс е известен като маркерен интерфейс или интерфейс на етикета. Той доставя информация за типа по време на изпълнение за даден обект. Това е причината, че JVM и компилаторът имат допълнителна информация за даден обект. The Може да се сериализира и Може да се клонира интерфейсите са пример за маркерен интерфейс. Накратко, той показва сигнал или команда към JVM.
Декларацията на интерфейса на маркера е същата като интерфейса в Java, но интерфейсът трябва да е празен. Например:
public interface Serializable { }
Има две алтернативи на интерфейса на маркера, който дава същия резултат като интерфейса на маркера.
Използване на интерфейса на маркера
Интерфейсът на маркера се използва като таг, който информира Java компилатора чрез съобщение, така че да може да добави някакво специално поведение към класа, който го прилага. Маркерният интерфейс на Java е полезен, ако имаме информация за класа и тази информация никога не се променя, в такива случаи използваме маркерен интерфейс за представяне, за да представим същото. Внедряването на празен интерфейс казва на компилатора да извърши някои операции.
Използва се за логическо разделяне на кода и е добър начин за категоризиране на кода. Той е по-полезен за разработване на API и в рамки като Spring.
Вграден интерфейс за маркери
в Java , вградените маркерни интерфейси са интерфейсите, които вече присъстват в JDK и са готови за използване. Има много вградени интерфейси за маркери, някои от тях са:
- Интерфейс за клониране
- Сериализиращ се интерфейс
- Дистанционен интерфейс
Нека обсъдим един по един в детайли.
vlc за изтегляне на youtube
Интерфейс за клониране
Почистващ се интерфейс в Java също е маркерен интерфейс, който принадлежи към java.lang пакет. Той генерира реплика (копие) на обект с различно име. Можем да имплементираме интерфейса в класа на кой клас обект да бъде клониран. То показва, клонинг() метод на класа Object. Ако не имплементираме интерфейса Cloneable в класа и извика метода clone(), той хвърля ClassNotSupportedException.
Имайте предвид, че клас, който имплементира интерфейса Cloneable, трябва да замени метода 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(); } }
Изход:
np.свързване
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, можем да сериализираме или десериализираме състоянието на обект от този клас.
Сериализацията (преобразуване на обект в поток от байтове) е механизъм, при който състоянието на обекта се чете от паметта и се записва във файл или база данни . Десериализацията (преобразуване на потока от байтове в обект) е обратното на сериализацията, което означава, че четене на състоянието на обекта от файл или база данни и записване обратно в паметта се нарича десериализация на обект.
Сериализация (писане) може да се постигне с ObjectOutputStream клас и десериализация (четене) може да се постигне с ObjectInputStream клас.
Нека видим пример за сериализация и десериализация.
Пример за сериализация
Служител.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; }
Внедрете отдалечения интерфейс
Има два начина за внедряване на отдалечен интерфейс:
- Чрез разширяване на класа UnicastRemoteObject
- Чрез използване на метода exportObject() на класа UnicastRemoteObject
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); } } }
Създайте и стартирайте клиентското приложение
Client.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.