我有一个界面:
public interface Myinterface{
...
}
界面由三个类实现,我们将它们命名为ClassOne
,ClassTwo
,ClassThree
。
现在,我有一个辅助方法,它返回一个类型为MyInterface
的实例。 e.g。
MyInterface myInstance = MyHelper.getOneInstance();
我要检查返回的实例myInstance
是否是ClassThree
的实例,如何在Java中执行?
(我知道Java中有instanceof
个关键字,但它反过来检查。我想知道实例来自哪个具体类。)
答案 0 :(得分:2)
要检查对象是否是特定类的实例,您可以使用getClass()
类中的Object
方法。
例如,只有当myInstance
是ClassThree
对象时才会出现这种情况:
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");
}
}
instanceof
和getClass()
实现之间的区别在于instanceof将查找层次结构
new ClassThree() instanceof MyInterface
是真的,而
new ClassThree().getClass() == MyInterface.class
是假的。
答案 2 :(得分:0)
通常,您不想知道实现类名称,但希望确保正确的行为。 访客模式是一个间接层,有自己的陷阱,但一般来说往往是要走的路。
我认为它比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){。 。 。 }