【问题标题】:JAVA - Refactoring multiple "instanceof" using a ListJAVA - 使用列表重构多个“instanceof”
【发布时间】:2016-07-27 09:50:35
【问题描述】:

目前我正在检查一个对象是否是 X、Y、Z 的实例并应用一些方法。 (这些只是插图:)

if (X instanceof Car || X instaceof Bus || ...) {
   X.color = RED;
}

但是,如果我有 300 个要比较的对象(例如:汽车、公共汽车、自行车、火车、飞机……),我将如何分解它?我想制作一个 List 或 Array 但初始化它似乎有点长:

Car car = new Car();
Bus bus = new Bus();
...
List<Transportation> list_t = Arrays.asList(car, bus, ...);
for (Transportation t : list_t) {
    if (X instance of t)
         X.color = RED;
}

任何建议将不胜感激,谢谢。

【问题讨论】:

  • 你有很多这样的if ststements吗?是否有任何类层次结构,或者没有具有子类的类型?
  • 您可能需要查看访问者模式。
  • 为什么不X.color = X.getColor();?然后当然你可以把它改成简单的X.setColor(); 然后你可以把它去掉,这样汽车、公共汽车等总是红色的。
  • 我会有很多“if”,目标只是重新组合不同的类型(例如:if instanceof ALL_TRANSPORT_USING_WHEELS,if instaceof AL_TRANSPORT_USING_WATER)。我可以创建超级类来重新组合它们,但如果有办法解决它会很好。
  • 您不需要为您的 ArrayList 创建实例,您可以使用 ClassName.class 代替,并使用 Class 而不是 Transportation 作为您的列表类型。

标签: java list refactoring instanceof


【解决方案1】:

我会使用一个通用的父接口。

class Car implements DisplayColour {
    public Color displayColor() {
          return Color.RED;
    }

如果你知道所有可能的类,我会使用 HashMap。

static final Map<Class, Color> classToColorMap = new HashMap<>(); 
static {
    classToColorMap.put(Car.class, Color.RED);
}

【讨论】:

  • 我只是想知道。这可以概括为,给定任何对象返回基于哪个类的适当颜色。例如有一个函数。 returnClassName(Object object) {returns className} ? .我与提问者无关。我只是对这个问题很感兴趣。
  • @Optimuskck 你可以做String className = object.getClass().getName();或者你可以打电话给String className = object.getClass().getSimpleName();
  • 是的。但是如果我理解正确,我要问的是您的第一个函数,您的第一个函数仅检查特定对象。我的意思是如果没有对特定对象的硬编码,我们不能概括给它检查的任何对象属于特定类并返回不同的字符串吗? .但我开始明白我在问一个不同的问题。对不起。
  • @Optimuskck 您可以通过让类返回一个像 4-wheeled-land-vehicle 这样的类别来概括它,您可以将此类别映射到一种颜色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2011-11-23
  • 1970-01-01
  • 2012-07-24
  • 2016-03-18
  • 2016-07-12
  • 2019-08-29
相关资源
最近更新 更多