Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在这种情况下,我应该使用什么模式/解决方案来避免“instanceof”?_Java_Oop_Instanceof - Fatal编程技术网

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

Java 在这种情况下,我应该使用什么模式/解决方案来避免“instanceof”?,java,oop,instanceof,Java,Oop,Instanceof,在这种情况下,我应该使用什么模式/解决方案来避免出现实例?我在谷歌上搜索了一下,发现访问者模式是一种选择,但我认为这不适用于这种情况。还有其他解决方案,比如在黑客解决方案中的短语中添加isTestable()方法,我正在寻找一种标准方法 public class PhraseOwner(){ List<Phrase> phrases; public void switchTestMode(){ for(Phrase phra

在这种情况下,我应该使用什么模式/解决方案来避免出现
实例?我在谷歌上搜索了一下,发现访问者模式是一种选择,但我认为这不适用于这种情况。还有其他解决方案,比如在黑客解决方案中的短语中添加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();
     }

访问者为不同或相同层次的对象收集相同类型的操作。
在您的例子中,它不是,因为其中一个对象错过了测试的概念

由于
短语
不可
测试
(或相反),我不会创建
列表
类型。
不要把苹果和橙子混在一起。收藏的仿制药最初是为了避免这种情况而发明的


您必须重新考虑您的代码设计,从
列表中辨别
列表
,或者通过构建分层链接(如果链接确实存在)来改进多态性。

一个解决方案是为不可测试的短语创建一个抽象类,只需使
.switchTestMode()
什么都不做:

public abstract class NonTestablePhrase
    implements Phrase, Testable
{
    @Override
    public final void switchTestMode()
    {
    }
}

然后您可以声明
公共类B扩展了不可测试短语

显而易见的答案是向这两个类添加一个布尔值,表示短语是否可测试。如果它是可测试的,它还应该实现可测试接口。然后,您可以检查任何短语上的布尔值,而不必事先知道它是否是可测试类。但是,我会在初始值设定项中使用instanceof()来设置该布尔值!我还将重载初始值设定项,以便通常将布尔值设置为False,除非具体实例化为True。

或者,您可以让可测试类和不可测试类分别实现可测试或不可测试接口,而根据多态性允许您在任一接口上调用方法“switchtestmode”!您不必测试实例,但必须为所有不可测试类实现不可测试接口(这对您来说可能是可行的,也可能是不可行的)

使用
instanceof
可以通过使用以下选项来避免使用:


诚然,这可能被认为是“语义学”,因为从技术上讲,它实现了目标,但它或多或少做了相同的事情。

所有的
词组也都是
可测试的
?如果是,
短语
可以扩展
可测试的
。为什么不有一个
列表
和一个
列表
?如何添加到列表中?@LaurentG不,不是所有的短语都是testable@fge我正在尽可能多地使用多态性,但迭代短语并从可测试接口调用方法有什么意义呢?也许你可以避免它。你所说的“你必须通过从列表中辨别列表来重新考虑你的代码设计,或者通过构建层次链接来改进多态性”是指使可测试也实现短语?@dave如果你认为所有的
短语都是
可测试的
,或者相反,那么让一个扩展另一个,两者都实现了相关的方法。否则,避免将它们混合在一个公共容器中。若testable扩展了短语,那个么testable中的方法就不一定存在于短语中。因此,我也应该在短语中添加可测试的方法,那么可测试的接口首先有什么意义呢?@dave因此,如果您最终使用“无意义”链接它们,只需重新编写代码,以便将您的
testable
特定代码仅针对
testable
对象。不幸的是,我们在你的作品中没有上下文来重新思考逻辑。当前代码类似于将
整数
字符串
混合,并检查
子字符串
实现方法。。。幸运的是,总是有一个解决方案来避免这些情况:),否则程序将真的很难看。设计模式从来都不是缺乏“良好判断力”的解决方案。我想我可以通过测试来扩展这个短语,然后我的篮子里会有桔子和其他种类的桔子。但我仍然无法找到一种方法来避免技术上可行的情况,但未来可能出现的十几种情况呢:不可测试、不可打印、不可写等等。。。这将是一个混乱和大量的“什么都不做”的方法。@Mik378是的,但是OP在这里没有分享她的很多目标。。。有限的范围,有限的答案;)不是一个面向对象的解决方案。。。字段设计类型根本不是多态性的有用替代品。与
实例“问题”类似,因为必须考虑手动决策。错误和错误。为避免在特定情况下使用实例而提出的问题,它从未声明“为仅在OOP范例中有意义的问题提供非OOP解决方案”。此外,初始化器集变量仅在为任何可能使用但可能无法测试的类编写初始化器时才是手动的。同样,这个问题超出了任何人应该用Java做什么的范围,因此无法回答。我的答案,虽然你认为它是无用的,但仍然是一个不同于你的答案,可能适合提问者,足以获得投票!你有机会:当有人问如何穿过人行横道时,我不会建议他乘地铁。我的回答不是基于结果:他必须在道路的另一边,而是基于对最有用和最有效的道路的解释,关于普通道路。你的答案仍然是肯定的,顺便说一句,这就是我没有投反对票的原因;)我将这个问题解释为:“我应该如何避免检查
可测试的
”,而不仅仅是
实例的特定技术方面。在这种情况下,
布尔值
实例
更难看,因为它是内部的,而且是冗余的。>为什么要在它上面缠绕轴?有太多的人在Java程序中编码;根本原因是
public abstract class NonTestablePhrase
    implements Phrase, Testable
{
    @Override
    public final void switchTestMode()
    {
    }
}
if (Testable.class.isAssignableFrom(phrase.getClass())) {
    ((Testable) phrase).switchTestMode();
}