首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在switch语句中使用instanceof运算符?

是否可以在switch语句中使用instanceof运算符?
EN

Stack Overflow用户
提问于 2011-04-07 18:03:29
回答 18查看 299.8K关注 0票数 316

我对使用instanceof对象的大小写有一个问题:

例如:我的问题可以用Java重现:

代码语言:javascript
运行
复制
if(this instanceof A)
    doA();
else if(this instanceof B)
    doB();
else if(this instanceof C)
    doC():

它将如何使用switch...case实现?

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2011-04-07 18:09:25

这是一个典型的场景,对子类型多态很有帮助。执行以下操作

代码语言:javascript
运行
复制
interface I {
  void do();
}

class A implements I { void do() { doA() } ... }
class B implements I { void do() { doB() } ... }
class C implements I { void do() { doC() } ... }

然后,您可以简单地在this上调用do()

如果您不能自由地更改ABC,则可以应用访问者模式来实现相同的更改。

票数 250
EN

Stack Overflow用户

发布于 2011-04-07 19:38:58

如果您绝对不能对接口进行编码,那么您可以使用枚举作为中介:

代码语言:javascript
运行
复制
public A() {

    CLAZZ z = CLAZZ.valueOf(this.getClass().getSimpleName());
    switch (z) {
    case A:
        doA();
        break;
    case B:
        doB();
        break;
    case C:
        doC();
        break;
    }
}


enum CLAZZ {
    A,B,C;

}
票数 110
EN

Stack Overflow用户

发布于 2017-02-28 23:50:15

创建一个Map,其中键是Class<?>,值是一个表达式(lambda或类似的)。考虑一下:

代码语言:javascript
运行
复制
Map<Class,Runnable> doByClass = new HashMap<>();
doByClass.put(Foo.class, () -> doAClosure(this));
doByClass.put(Bar.class, this::doBMethod);
doByClass.put(Baz.class, new MyCRunnable());

// of course, refactor this to only initialize once

doByClass.get(getClass()).run();

如果您需要检查异常,那么实现一个抛出ExceptionFunctionalInterface,并使用它代替Runnable

这是一个真实的前后对比,展示了这种方法如何简化代码。

重构到map之前的代码:

代码语言:javascript
运行
复制
private Object unmarshall(
  final Property<?> property, final Object configValue ) {
  final Object result;
  final String value = configValue.toString();

  if( property instanceof SimpleDoubleProperty ) {
    result = Double.parseDouble( value );
  }
  else if( property instanceof SimpleFloatProperty ) {
    result = Float.parseFloat( value );
  }
  else if( property instanceof SimpleBooleanProperty ) {
    result = Boolean.parseBoolean( value );
  }
  else if( property instanceof SimpleFileProperty ) {
    result = new File( value );
  }
  else {
    result = value;
  }

  return result;
}

重构成映射后的代码:

代码语言:javascript
运行
复制
private final Map<Class<?>, Function<String, Object>> UNMARSHALL = 
Map.of(
  SimpleBooleanProperty.class, Boolean::parseBoolean,
  SimpleDoubleProperty.class, Double::parseDouble,
  SimpleFloatProperty.class, Float::parseFloat,
  SimpleFileProperty.class, File::new
);

private Object unmarshall(
  final Property<?> property, final Object configValue ) {
  return UNMARSHALL
    .getOrDefault( property.getClass(), ( v ) -> v )
    .apply( configValue.toString() );
}

这避免了重复,消除了几乎所有的分支语句,并简化了维护。

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5579309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档