[英]What pattern/solution should i use to avoid `instanceof` in this case?
在这种情况下,应使用哪种模式/解决方案来避免instanceof
? 我在Google上搜索了一下,发现访问者模式是必经之路,但在这种情况下我认为这并不适用。 还有其他解决方案,例如在某种黑客解决方案中向短语添加isTestable()方法,我正在寻找一种标准的解决方法。
public class PhraseOwner(){
List<Phrase> phrases;
public void switchTestMode(){
for(Phrase phrase : phrases){
if(phrase instanceof Testable())
(Testable)phrase.switchTestMode();
}
}
}
public interface Phrase{
//STUFF
}
public interface Testable{
public void switchTestMode();
}
我有两种类型的类,那些仅实现了Phrase
接口的类和那些同时实现了Phrase
和Testable
接口的类。
public class A implements Phrase,Testable{
public void switchTestMode(){
//stuff
}
}
public class B implements Phrase{
//stuff
}
}
访客针对不同或相同的对象层次结构收集相同的操作。
在您的情况下,不是 ,因为其中一个对象错过了测试的概念。
由于Phrase
不可Testable
(或相反),因此我不会创建List<Phrase>
类型。
不要将苹果和橘子混合。 为避免这种情况,主要是发明了通用的收藏品。
您必须通过从List<Testable>
识别List<Phrase>
来重新考虑代码设计,或者如果存在链接,则通过构建层次结构链接来改善多态性。
一种解决方案是为无法测试的短语创建一个抽象类,然后使.switchTestMode()
不执行任何操作:
public abstract class NonTestablePhrase
implements Phrase, Testable
{
@Override
public final void switchTestMode()
{
}
}
然后,您可以声明public class B extends NonTestablePhrase
。
显而易见的答案是在两个类中都添加一个布尔值,该值指示短语是否可测试。 如果它是可测试的,则还应该实现Testable接口。 然后,您可以检查任何短语上的布尔值,而无需先验地知道它是否是可测试的类。 但是,我将在初始化程序中使用instanceof()设置该布尔值! 我还将重载初始化程序,以便通常将Boolean设置为False,除非特别实例化为True。
另外,您可以让可测试和不可测试的类分别实现可测试或不可测试的接口,同时根据多态性允许您在任一接口上调用方法“ switchtestmode”! 您不必测试实例,但必须为所有不可测试的类实现不可测试的接口(某些可能对您不可行的东西)
使用instanceof
可以通过使用被避免Class#isAssignableFrom()
代替:
if (Testable.class.isAssignableFrom(phrase.getClass())) {
((Testable) phrase).switchTestMode();
}
诚然,这可以被视为“语义学”,因为从技术上讲,它达到了目标,但它或多或少地完成了同样的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.