[英]Which class the interface type instance is from
我有一個界面:
public interface Myinterface{
...
}
該接口由三個類實現,我們將其命名為ClassOne
, ClassTwo
, ClassThree
。
現在,我有一個幫助程序方法,該方法返回MyInterface
類型的實例。 例如
MyInterface myInstance = MyHelper.getOneInstance();
我該如何檢查返回的實例myInstance
是否是ClassThree
的實例,如何在Java中進行呢?
(我知道Java中有instanceof
關鍵字,但是它正在反過來檢查。我想知道實例來自哪個具體類。)
要檢查對象是否是特定類的實例,可以使用Object
類中的getClass()
方法。
例如,僅當myInstance
是ClassThree
對象時,才為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");
}
}
instanceof
和getClass()
實現之間的區別在於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.