繁体   English   中英

在这种情况下,应使用哪种模式/解决方案来避免使用“ instanceof”?

[英]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接口的类和那些同时实现了PhraseTestable接口的类。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM