У овом одељку ћемо разговарати о интерфејс маркера у Јави , његово користи, уграђен ( Сериализабле , Цлонеабле и удаљени интерфејси) и прилагођени интерфејс маркера са примерима.
Шта је интерфејс маркера?
Ан интерфејс који не садржи методе, поља и константе је познат као интерфејс маркера . Другим речима, празан интерфејс је познат као интерфејс маркера или таг интерфејс. Он испоручује информације о типу времена извршавања о објекту. То је разлог што се ЈВМ и компајлер имају додатне информације о објекту. Тхе Сериализабле и Цлонеабле интерфејси су пример интерфејса маркера. Укратко, указује на сигнал или команду ЈВМ-у.
Декларација интерфејса маркера је иста као интерфејс у Јави, али интерфејс мора бити празан. На пример:
public interface Serializable { }
Постоје две алтернативе интерфејса маркера који даје исти резултат као интерфејс маркера.
Употреба интерфејса маркера
Интерфејс маркера се користи као ознака која обавештава Јава компајлер поруком тако да може додати неко посебно понашање класи која га имплементира. Јава интерфејс маркера је користан ако имамо информације о класи и те информације се никада не мењају, у таквим случајевима користимо интерфејс маркера који представља исто. Имплементација празног интерфејса говори компајлеру да изврши неке операције.
Користи се за логичку поделу кода и добар начин за категоризацију кода. Кориснији је за развој АПИ-ја и у оквирима као што је Спринг.
Уграђени интерфејс маркера
Ин Јава , уграђени интерфејси маркера су интерфејси који су већ присутни у ЈДК-у и спремни за употребу. Постоји много уграђених интерфејса маркера, неки од њих су:
- Цлонеабле Интерфаце
- Сериализабле Интерфаце
- Ремоте Интерфаце
Хајде да детаљно разговарамо један по један.
Цлонеабле Интерфаце
Интерфејс који се може очистити у Јави је такође интерфејс маркера који припада јава.ланг пакет. Генерише реплику (копију) објекта са другачијим именом. Интерфејс можемо имплементирати у класу објекта које класе треба клонирати. То указује на клон () метод класе Објецт. Ако не имплементирамо интерфејс Цлонеабле у класу и позовемо метод цлоне(), он избацује ЦлассНотСуппортедЕкцептион.
Имајте на уму да класа која имплементира Цлонеабле интерфејс мора да надјача методу цлоне() јавном методом. Хајде да видимо пример.
Продуцт.јава
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(); } }
Излаз:
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
Сериализабле Интерфаце
То је интерфејс маркера у Јави који је дефинисан у јава.ио пакет. Ако желимо да класу учинимо серијализљивом, морамо имплементирати Сериализабле интерфејс. Ако класа имплементира Сериализабле интерфејс, можемо серијализирати или десериализовати стање објекта те класе.
Серијализација (претварање објекта у ток бајтова) је механизам у коме стање објекта се чита из меморије и уписује у датотеку или базу података . Десеријализација (претварање тока бајтова у објекат) је супротност серијализацији значи да читање стања објекта из датотеке или базе података и враћање у меморију назива се десеријализација објекта.
Серијализација (писање) се може постићи помоћу ОбјецтОутпутСтреам класе и десериализација (читање) може се постићи помоћу ОбјецтИнпутСтреам класа.
Погледајмо пример серијализације и десериализације.
Пример серијализације
Емплоиее.јава
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; } }
СериализатионЕкампле.јава
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.
Пример десериализације
Хајде да десериализујемо стање објекта.
ДесериализатионЕкампле.јава
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
Ремоте Интерфаце
Удаљени интерфејс је интерфејс маркера који припада јава.рми пакет. Означава објекат као удаљени коме се може приступити са друге машине (хост). Морамо имплементирати Ремоте интерфејс ако желимо да направимо објекат као удаљен. Он идентификује интерфејсе чије методе се могу позвати из не-локалног ЈВМ-а. Сваки удаљени објекат мора директно или индиректно имплементирати интерфејс.
Хајде да дефинишемо Ремоте интерфејс и имплементирамо га у Јава програм.
Дефинисање удаљеног интерфејса
import java.rmi.*; public interface AddAll extends Remote { public int add(int r, int s)throws RemoteException; }
Имплементирајте удаљени интерфејс
Постоје два начина за имплементацију Ремоте интерфејса:
ипцонфиг за убунту
- Проширујући класу УницастРемотеОбјецт
- Коришћењем методе екпортОбјецт() класе УницастРемотеОбјецт
АддАллРемоте.јава
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; }
Креирајте и покрените удаљену апликацију
Сервер.јава
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); } } }
Креирајте и покрените клијентску апликацију
Цлиент.јава
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) { } } }
Прилагођени интерфејс маркера
Поред уграђеног интерфејса маркера, Јава нам такође омогућава да креирамо сопствени интерфејс маркера. Хајде да видимо пример.
ЦустомМаркерИнтерфацеЕкампле.јава
//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.