Nesta seção, discutiremos sobre interface de marcador em Java , isso é usa, integrado ( Serializável , Clonável e interfaces remotas) e interface de marcador personalizada com exemplos.
O que é interface de marcador?
Um interface que não contém métodos, campos e constantes é conhecido como interface de marcador . Em outras palavras, uma interface vazia é conhecida como interface de marcador ou interface de tags. Ele fornece informações do tipo de tempo de execução sobre um objeto. É a razão pela qual JVM e o compilador possuem informações adicionais sobre um objeto. O Serializável e Clonável interfaces são o exemplo de interface de marcador. Resumindo, indica um sinal ou comando para a JVM.
A declaração da interface do marcador é a mesma da interface em Java, mas a interface deve estar vazia. Por exemplo:
public interface Serializable { }
Existem duas alternativas de interface de marcador que produzem o mesmo resultado que a interface de marcador.
Usos da interface do marcador
A interface do marcador é usada como uma tag que informa o compilador Java por meio de uma mensagem para que ele possa adicionar algum comportamento especial à classe que o implementa. As interfaces de marcadores Java são úteis se tivermos informações sobre a classe e essas informações nunca mudam, nesses casos, usamos a interface de marcadores representa para representar a mesma. A implementação de uma interface vazia diz ao compilador para realizar algumas operações.
É usado para dividir logicamente o código e é uma boa maneira de categorizar o código. É mais útil para desenvolver APIs e em frameworks como Spring.
Interface de marcador integrada
Em Java , as interfaces de marcador integradas são as interfaces que já estão presentes no JDK e prontas para uso. Existem muitas interfaces de marcadores integradas, algumas delas são:
- Interface clonável
- Interface serializável
- Interface Remota
Vamos discutir um por um em detalhes.
Interface clonável
Interface limpável em Java também é uma interface de marcador que pertence a java.lang pacote. Gera réplica (cópia) de um objeto com nome diferente. Podemos implementar a interface na classe do objeto de classe a ser clonado. Ele indica o clone() método da classe Object. Se não implementarmos a interface Cloneable na classe e invocarmos o método clone(), ele lançará o ClassNotSupportedException.
Observe que uma classe que implementa a interface Cloneable deve substituir o método clone() por um método público. Vejamos um exemplo.
Produto.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(); } }
Saída:
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
Interface serializável
É uma interface de marcador em Java que é definida no java.io pacote. Se quisermos tornar a classe serializável, devemos implementar o Serializável interface. Se uma classe implementa a interface Serializable, podemos serializar ou desserializar o estado de um objeto dessa classe.
A serialização (conversão de um objeto em fluxo de bytes) é um mecanismo no qual o estado do objeto é lido da memória e gravado em um arquivo ou banco de dados . A desserialização (conversão do fluxo de bytes em um objeto) é o oposto da serialização, significa que leitura do estado do objeto de um arquivo ou banco de dados e escrita de volta na memória é chamado de desserialização do objeto.
A serialização (escrita) pode ser alcançada com o ObjectOutputStream classe e desserialização (leitura) podem ser alcançadas com o ObjectInputStream aula.
Vamos ver um exemplo de serialização e desserialização.
Exemplo de serialização
Funcionário.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
atriz de cinema rekha
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(); } } }
Saída:
Data has been read from the file.
Exemplo de desserialização
Vamos desserializar o estado do objeto.
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(); } } }
Saída:
1187345 Andrew
Interface Remota
Interface remota é uma interface de marcador que pertence a java.rmi pacote. Marca um objeto como remoto que pode ser acessado de outra máquina (host). Devemos implementar a interface Remote se quisermos tornar um objeto remoto. Identifica as interfaces cujos métodos podem ser invocados a partir de uma JVM não local. Qualquer objeto remoto deve implementar a interface direta ou indiretamente.
Vamos definir uma interface remota e implementá-la em um programa Java.
Definindo interface remota
import java.rmi.*; public interface AddAll extends Remote { public int add(int r, int s)throws RemoteException; }
Implementar a interface remota
Existem duas maneiras de implementar a interface remota:
- Estendendo a classe UnicastRemoteObject
- Usando o método exportObject() da classe 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; }
Crie e inicie o aplicativo remoto
Servidor.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); } } }
Crie e inicie o aplicativo cliente
Cliente.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) { } } }
Interface de marcador personalizado
Além da interface de marcador integrada, Java também nos permite criar sua própria interface de marcador. Vejamos um exemplo.
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(); } }
Saída:
Car is a vehicle. Yes, engine is working.