接口类型实例来自哪个类

时间:2017-05-26 12:23:27

标签: java

我有一个界面:

public interface Myinterface{
  ...
}

界面由三个类实现,我们将它们命名为ClassOneClassTwoClassThree

现在,我有一个辅助方法,它返回一个类型为MyInterface的实例。 e.g。

MyInterface myInstance = MyHelper.getOneInstance();

我要检查返回的实例myInstance是否是ClassThree的实例,如何在Java中执行?

(我知道Java中有instanceof个关键字,但它反过来检查。我想知道实例来自哪个具体类。)

4 个答案:

答案 0 :(得分:2)

要检查对象是否是特定类的实例,您可以使用getClass()类中的Object方法。

例如,只有当myInstanceClassThree对象时才会出现这种情况:

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

现在,通常这不一定更强大,因为它会破坏OOP的一些好处 更多的OOP方法是引入一种可用于检查的方法。

由于您没有给出一个具体的例子,很难给出一个改编的例子,但假设您想要保存一些类,如果它们是可记录的。
您可以在界面中引入boolean isRecordable()方法。

通过这种方式你可以做到:

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

答案 1 :(得分:0)

如果instanceof ClassThree返回ClassThree对象,则非常确定getOneInstance()为真。

    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是真的,而

new ClassThree().getClass() == MyInterface.class是假的。

答案 2 :(得分:0)

尝试visitor pattern

通常,您不想知道实现类名称,但希望确保正确的行为。 访客模式是一个间接层,有自己的陷阱,但一般来说往往是要走的路。

我认为它比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());

这是不可测试的,我只是把它写下来了。 我不得不承认返回Class这不是最好的主意,但正如已经说过的那样,通常你不想这样做。

答案 3 :(得分:0)

你试过&#34;是&#34;关键词? if(myInstance是ClassThree){。 。 。 }