【问题标题】:Different design decisions with if-else-statements使用 if-else 语句的不同设计决策
【发布时间】:2015-12-25 19:14:33
【问题描述】:

您更喜欢以下哪一项:

    SomeEnum enum = SomeEnum.SOMETHING;
    if (aString.equals(anotherString)) {
        enum = SomeEnum.SOMETHING_ELSE;
    }
    return foo.bar(enum);

    if (aString.equals(anotherString)) {
        return foo.bar(SomeEnum.SOMETHING_ELSE);
    }
    return foo.bar(SomeEnum.SOMETHING);

我想我会更喜欢第一个,因为它只有 1 个回报点。另一方面,我认为第二个更容易阅读。你怎么看?也许你有一个更复杂的解决方案。

【问题讨论】:

  • 我个人会使用额外的局部变量,但使用条件运算符:SomeEnum x = aString.equals(anotherString) ? SomeEnum.SOMETHING_ELSE : SomeEnum.SOMETHING; return foo.bar(x); 不将其添加为答案,因为这确实是一个意见问题。
  • 您是否打算拥有多个枚举,或者有问题的代码是您唯一的用例?
  • 几个枚举?我只是在这里谈论一个枚举,那就是'SomeEnum'。

标签: java if-statement return


【解决方案1】:

这取决于我们谈论的项目数量:

对于大型枚举,我会保留从字符串到枚举对象的映射。我会在地图中查找该项目并提供 SomeEnum.SOMETHING 作为默认值。

public SomeEnum get(String key, SomeEnum defaultValue){
    SomeEnum value = this.map.get(key);
    return value == null ? defaultValue : value;
}

对于较少的项目,我可能会使用 switch 语句:

public SomeEnum get(String key, SomeEnum defaultValue){
    switch(key){
        case "somevalue1" : return SomeEnum.SOME_VALUE_1;
        case "somevalue2" : return SomeEnum.SOME_VALUE_2;
        default: return defaultValue;
    }
}

但如果实际上只是问题中提到的两种情况,我会选择

return aString.equals(anotherString) ? SomeEnum.SOMETHING_ELSE : SomeEnum.SOMETHING;

【讨论】:

  • 鉴于您需要一些额外的工作来检查是否需要默认值,因此为 one 值创建映射似乎有点过头了。
  • 主观问题,但这绝对是客观上最好的答案。
  • @christopher:我不知道它是如何客观地最好的。这里使用了哪些确切的客观标准?
  • @JonSkeet 显然,如果涉及两个以上的值,我只会推荐这种方法
  • @christopher:但它在假设将使用更多比较的情况下引入了在某处放置地图的复杂性。 如果和何时代码变得更复杂,将单个相等检查转换为地图查找很容易 - 但最初这样做并没有明显的好处,IMO。
【解决方案2】:

这并不重要。像这样的简化可能会被编译器优化!您应该使用任何使您的代码更具可读性的东西!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多