簡體   English   中英

接口類型實例來自哪個類

[英]Which class the interface type instance is from

我有一個界面:

public interface Myinterface{
  ...
}

該接口由三個類實現,我們將其命名為ClassOneClassTwoClassThree

現在,我有一個幫助程序方法,該方法返回MyInterface類型的實例。 例如

MyInterface myInstance = MyHelper.getOneInstance();

我該如何檢查返回的實例myInstance是否是ClassThree的實例,如何在Java中進行呢?

(我知道Java中有instanceof關鍵字,但是它正在反過來檢查。我想知道實例來自哪個具體類。)

要檢查對象是否是特定類的實例,可以使用Object類中的getClass()方法。

例如,僅當myInstanceClassThree對象時,才為true:

if (myInstance.getClass() == ClassThree.class)

現在,通常這並不一定會更強大,因為它會破壞OOP的某些優勢。
另一種OOP方式是引入一種可用於執行此檢查的方法。

由於您沒有給出具體的示例,因此很難給出一個經過修改的示例,但是假設您想保存一些可記錄的類。
您可以在界面中引入boolean isRecordable()方法。

通過這種方式,您可以:

if (myInstance.isRecordable()){
    ...
}

如果getOneInstance()返回ClassThree對象,則可以getOneInstance()肯定instanceof ClassThree為true。

    while (true){
        MyInterface impl = MyHelper.getOneInstance()();
        if(impl instanceof Class1){
            System.out.println("was 1");
        } else if(impl instanceof Class2){
            System.out.println("was 2");
        } else if(impl instanceof Class3){
            System.out.println("was 3");
        }
    }

instanceofgetClass()實現之間的區別在於instanceof將查找層次結構,因此

new ClassThree() instanceof MyInterface為true,而

new ClassThree().getClass() == MyInterface.class為false。

嘗試訪客模式

通常,您不想知道實現類的名稱,但是想要確保正確的行為。 訪客模式是一個間接層,具有其自身的陷阱,但通常來說通常是要走的路。

我認為它比instance of更好instance of因為有時您的對象是不同類/接口的實例,因此您的檢查必須考慮所有可能的組合,並且不能盡早返回。 另一個缺點是,如果你使用getClass()你的代碼會變得凌亂if小號進行的跨項目,而游客給你一個中心位置。

public interface MyVisitor<T> {
    T visitClassOne(ClassOne classOne);
    T visitClassTwo(ClassTwo classTwo);
    T visitClassThree(ClassThree classThree);
}

public interface MyInterface {
    Class acceptVisitor(MyVisitor myVisitor);
}

public class ClassOne implements MyInterface {
    @Override
    Class acceptVisitor(MyVisitor myVisitor) {
        return myVisitor.visitClassOne(this);
    }
}


//or maybe call the desired methods directly, instead of returning the 
//Class an call the desired methods based on the result. 
public class ClassVisitor implements MyVisitor<Class> {
    @Override
    Class visitClassOne(ClassOne classOne) {
        return classOne.getClass();
    }

    @Override
    Class visitClassTwo(ClassTwo classTwo) {
        return classTwo.getClass();
    }

    @Override
    Class visitClassThree(ClassThree classThree) {
        return classThree.getClass();
    }
}

所以在其他地方你可以做:

MyInterface myClass = new ClassOne();
Class myClassClass = myClass.acceptVisitor(new ClassVisitor());

這是untestet,我只是寫下來。 我不得不承認,返回Class並不是最好的想法,但是正如已經說過的,通常您不想這樣做。

您是否嘗試過“ is”關鍵字? 如果(myInstance是ClassThree){。 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM