当前位置: 首页 > 面试题库 >

如何避免大型的if语句和instanceof

岳佐
2023-03-14
问题内容

动物

public abstract class Animal {
 String name;

 public Animal(String name) {
  this.name = name;
 }

}

狮子

public class Lion extends Animal {

 public Lion(String name) {
  super(name);
  // TODO Auto-generated constructor stub
 }

 public void roar() {
  System.out.println("Roar");
 }
}

鹿

public class Deer extends Animal {

 public Deer(String name) {
  super(name);
 }

 public void runAway() {
  System.out.println("Running...");
 }

}

测试动物

public class TestAnimals {
 public static void main(String[] args) {
  Animal lion = new Lion("Geo");
  Animal deer1 = new Deer("D1");
  Animal deer2 = new Deer("D2");

  List<Animal> li = new ArrayList<Animal>();
  li.add(lion);
  li.add(deer1);
  li.add(deer2);
  for (Animal a : li) {
   if (a instanceof Lion) {
    Lion l = (Lion) a;
    l.roar();
   }
   if (a instanceof Deer) {
    Deer l = (Deer) a;
    l.runAway();
   }

  }
 }
}

在上面的情况下,似乎没有问题,但是如果您有很多扩展的基类扩展,那么我们也需要那么多的if块。解决这个问题?


问题答案:

避免instanceof在基类中(不 使用 诸如performActionor
的非描述性名称doWhatYouAreSupposedToDo)发明任何新的人工方法的一种优雅方法是 使用
访问者模式
。这是一个例子:

动物

import java.util.*;

abstract class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public abstract void accept(AnimalVisitor av);  // <-- Open up for visitors.

}

狮子鹿

class Lion extends Animal {
    public Lion(String name) {
        super(name);
    }
    public void roar() {
        System.out.println("Roar");
    }

    public void accept(AnimalVisitor av) {
        av.visit(this);                            // <-- Accept and call visit.
    }
}


class Deer extends Animal {

    public Deer(String name) {
        super(name);
    }

    public void runAway() {
        System.out.println("Running...");
    }

    public void accept(AnimalVisitor av) {
        av.visit(this);                            // <-- Accept and call visit.
    }

}

游客

interface AnimalVisitor {
    void visit(Lion l);
    void visit(Deer d);
}

class ActionVisitor implements AnimalVisitor {

    public void visit(Deer d) {
        d.runAway();
    }

    public void visit(Lion l) {
        l.roar();
    }
}

测试动物

public class TestAnimals {
    public static void main(String[] args) {
        Animal lion = new Lion("Geo");
        Animal deer1 = new Deer("D1");
        Animal deer2 = new Deer("D2");

        List<Animal> li = new ArrayList<Animal>();
        li.add(lion);
        li.add(deer1);
        li.add(deer2);
        for (Animal a : li)
            a.accept(new ActionVisitor());         // <-- Accept / visit.
    }
}


 类似资料:
  • 问题内容: 我有一个方法可以依次调用其他4种方法来检查特定条件,并且每当一个方法返回Truthy时立即返回(而不检查以下方法)。 这似乎是很多行李代码。与其执行每行2行的if语句,不如执行以下操作: 但这是无效的Python。我在这里错过了一个简单,优雅的解决方案吗?顺便说一句,在这种情况下,这四种检查方法可能很昂贵,因此我不想多次调用它们。 问题答案: 您可以使用循环: 这样做还有一个好处,就是

  • 问题内容: 我正在尝试编写一个Java程序,该程序根据用户选择的内容初始化某些布局。我想做的是尝试避免编写一堆if语句,以便在需要添加更多布局的情况下可以对代码进行伸缩以供将来使用。我听说实现此目标的最佳方法是使用多态性,但是我对多态性的理解仍然有些模糊。 说我要实现这种情况: 我当时在考虑为类的实现创建一个接口。令我困惑的是它在main()中是如何工作的,我是否仍然不需要条件if或switch语

  • 问题内容: 我已经编写了类似这样的方法。但是我猜这应该进行重构。谁能建议最好的方法来避免使用多个if语句? 我在这里不能使用大小写转换,因为我的“条件”是。 问题答案: 您可以使用来保存您的解决方案: 为了使此代码起作用,您需要像在类中那样进行定义和定义,如下所示:

  • 我有一个方法,按顺序调用4个其他方法来检查特定条件,并且每当返回Truthy的内容时立即返回(不检查以下内容)。 这似乎有很多行李编码。我宁愿这样做,而不是每个2行if语句: 但这是无效的Python。我是否错过了一个简单、优雅的解决方案?顺便提一下,在这种情况下,这四种检查方法可能很昂贵,因此我不想多次调用它们。

  • 你们可能都遇到过以下场景: } 简而言之,如何在Objective-C的氛围中有效地简化上述场景? 有什么建议/想法/解决方案吗?干杯:) 编辑:供参考,从这里拍摄的场景。我希望这个问题可以节省哪怕一秒钟需要的开发人员。