我知道java中的標記接口。它用於定義關於類的特定行爲。例如,Serializable接口具有將對象存儲到字節流及其相反過程的特定功能。但我不知道這個特定的行爲在哪裏實施,因爲它沒有任何方法。如何在Java中編寫我們自己的標記接口?
- JVM如何調用此特定行爲?
- 如何編寫我們自己的標記界面?你能給我一個簡單的用戶定義的標記界面,我的理解?
- 是否有可能在標記接口中有方法?
請指導我解決此問題。
我知道java中的標記接口。它用於定義關於類的特定行爲。例如,Serializable接口具有將對象存儲到字節流及其相反過程的特定功能。但我不知道這個特定的行爲在哪裏實施,因爲它沒有任何方法。如何在Java中編寫我們自己的標記接口?
請指導我解決此問題。
序列化由ObjectInputStream
和ObjectOutputStream
類處理。如果某個班級有特殊的序列號需求,則在API中概述創建的方法。反射用於調用這些方法。
與編寫任何其他接口的方式相同。
沒有什麼能阻止你將標記方法放入標記界面。
現在比較常見的做法是使用annotations來提供相同的元數據標記接口。
:非常感謝你...我想知道他們在哪個地方編寫關於ObjectInputStream類的代碼......然後,只有我可以編寫自己的標記接口,如可以serilizable ... – Saravanan
通過提到的類的來源,而不是要求確切的線! – Premraj
@Saravanan JDK是開源的。 ['ObjectInputStream'](http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectInputStream.java/?v=source)。 ['ObjectOutputStream'](http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectOutputStream.java/?v=source)。 – Jeffrey
據我所知,標記接口通過「實用程序」類獲取它們的行爲。例如,如果您已經閱讀了四人幫的設計模式手冊,那麼您的行爲是使用另一個類中定義的標記接口標記的類。
例如,您有一個標記界面「可保存」。你有一個遍歷實現這個接口的所有類的過程(通過反射),然後保存它的操作。
正如維基百科文章Marker interface pattern中非常好地解釋的那樣,標記接口是一種元數據形式。客戶端代碼可以測試一個對象是否是標記接口的一個實例,並相應地調整它的(客戶端)行爲。這裏有一個標記接口:
public interface CoolObject {
}
然後代碼可以測試對象是否爲CoolObject
,並用它做什麼:
if (anObject instanceof CoolObject) {
addToCoolList((CoolObject) anObject);
}
的Serializable
接口定義爲Java語言的一部分。你不能在這個級別自己實現行爲。
您可以將方法添加到標記接口,但會將標記模式與接口的其他概念使用混合在一起,並且可能會造成混淆。 (是否爲實現標記或其行爲或兩者而實現接口的類?)
正如維基百科文章中所解釋的,Java中的標記接口可以(也可能應該)用annotations替換。
ObjectOutputStream
和ObjectInputStream
會檢查你的類它是否implementes Serializable
,Externalizable
。如果是,它會繼續或否則會拋出NonSerializableException
。
創建無任何方法的接口,這是你的標記接口。
樣品
public interface IMarkerEntity {
}
如果它實現這個接口將您的應用程序被認爲是數據庫實體的任何類。
示例代碼:
public boolean save(Object object) throws InvalidEntityException {
if(!(object instanceof IMarkerEntity)) {
throw new InvalidEntityException("Invalid Entity Found, cannot proceed);
}
database.save(object);
}
的Marker Interface Pattern的整體思路是提供一個的意思是說「是的,我的東西」,然後系統會使用默認的過程,就像繼續當你標記你的類作爲Serialzable它只是告訴這個類可以轉換爲字節。
這必須是答案 –
是的,我們可以創建自己的標記interface..See下一個...
interface Marker{
}
class MyException extends Exception {
public MyException(String s){
super(s);
}
}
class A {
void m1() throws MyException{
if((this instanceof Marker)){
System.out.println("successfull");
}
else {
throw new MyException("Must implement interface Marker ");
}
}
}
public class CustomMarkerInterfaceExample extends A implements Marker
{ // if this class will not implement Marker, throw exception
public static void main(String[] args) {
CustomMarkerInterfaceExample a= new CustomMarkerInterfaceExample();
try {
a.m1();
} catch (MyException e) {
System.out.println(e);
}
}
}
標記接口,沒有任何方法。 Java內置標記接口,如JVM所理解的Serializable
,Clonable
& EventListner
等。
我們可以創建自己的標記接口,但它與JVM無關,我們可以用instanceOf
添加一些檢查。
創建了空接口
interface Marker{ }
編寫類和實現接口
class A implements Marker {
//do some task
}
Main
類檢查標記接口instanceof
class Main {
public static void main(String[] args) {
A ob = new A()[
if (ob instanceOf Marker) {
// do some task
}
}
}
你可能想要更多的關注,何時你編寫代碼,因爲你的第3點代碼有幾個錯誤。 – Tom
爲什麼你要寫標記接口?這是一種過時的事情。使用_annotations _....無論如何,你會使用自己的「標記界面」 –
@Op De Cirkel - 它絕對不是過時的,首要的是,標記接口定義了一個類型,由標記類的實例實現;標記註釋不。閱讀有效的Java第2版第37項以獲取更多詳細信息。 – Premraj