7

我需要有关在 Java 中应用条件的正确方法的建议。

我有 100 个条件,我必须根据这些条件更改将显示给用户的字符串变量的值。

一个示例条件:a<5 && (b>0 && c>8) && d>9 || x!=4

有更多的条件,但变量或多或少是相同的。

我现在正在这样做:

    if(condition1)
    else if(condition2)
    else if(condition3)
    ...

一个 switch case 替代方案显然会嵌套在 if-else 中,即

if(condition1)
 switch(x)
  {
   case y:
     blah-blah
   }        
else if(condition2)
switch(x)
  {
   case y:
     blah-blah
   }  
else if(condition3)
...

但是我正在寻找一些更优雅的解决方案,例如使用具有多态支持的接口,我可以做些什么来避免代码行或应该是正确的方法。

- -编辑 - -


在此处输入图像描述

我实际上在 android 设备上需要这个。但它在这里更像是一个 java 构造。

这是我所拥有的条件的一个小快照。如果有几个通过/失败,将添加更多。这显然需要更多带有/不带有嵌套的 if-else。在那种情况下,处理会变慢。

我现在将消息存储在一个单独的类中,其中包含我保持静态的各种字符串变量,所以如果条件为真,那么我从唯一的类中选择静态变量并显示那个。存储结果消息是否正确。

4

4 回答 4

7

HashMap根据条件输入的数量,您可以通过将所有输入甚至一些相对简单的复杂条件编码为单个值来使用查找表,甚至是:

int key = 0;

key |= a?(1):0;
key |= b?(1<<1):0;
key |= (c.size() > 1)?(1<<2):0;
...

String result = table[key]; // Or result = map.get(key);

这种范式具有恒定时间 ( O(1)) 复杂性的额外优势,这在某些情况下可能很重要。根据条件的复杂性,您甚至可能在代码路径中平均拥有更少的分支,而不是完整的if-then-else意大利面条代码,这可能会导致性能改进。

如果您在问题中添加更多上下文,我们可能会为您提供更多帮助。条件输入来自哪里?他们像什么?

还有更重要的问题:您要解决的实际问题是什么?

于 2013-01-09T13:52:39.450 回答
4

这有很多可能性。在不了解您的域的情况下,我会创建类似的东西(您可以想到更好的名称:P)

 public interface UserFriendlyMessageBuilder {
      boolean meetCondition(FooObjectWithArguments args);

      String transform(String rawMessage);
 }

通过这种方式,您可以创建一个SetofUserFriendlyMessageBuilder并且只对它们进行迭代,以便第一个满足转换原始消息的条件。

public class MessageProcessor {
    private final Set<UserFriendlyMessageBuilder> messageBuilders;

    public MessageProcessor(Set<UserFriendlyMessageBuilder> messageBuilders) {
        this.messageBuilders = messageBuilders;
    }

    public String get(FooWithArguments args, String rawMsg) {

        for (UserFriendlyMessageBuilder msgBuilder : messageBuilders) {
            if (msgBuilder.meetCondition(args)) {
                return msgBuilder.transform(rawMsg);
            }
        }
        return rawMsg;    
    }
}
于 2013-01-09T13:53:55.690 回答
0

在我看来,“您对模块式产品设计的重视程度很低”,这是使用 OOP 语言的主要因素。

例如:如果您有 100 个条件并且您能够制作 4 个模块,那么理论上要选择任何东西,您都需要 26 个条件。

于 2013-01-09T14:11:00.977 回答
0

这是另一种可能值得考虑的可能性。

进行每个比较,并计算其真值,然后在真值表中查找结果 boolean[]。有很多现有的工作可以简化你可以应用的真值表。我有一个多年前编写的真值表简化小程序。您可能会发现它的源代码很有用。

这样做的代价是进行所有比较,或者至少是使用简化真值表评估表达式所需的比较。优点是用于管理复杂条件组合的有组织的系统。

即使您不直接在代码中使用真值表,也请考虑将编写和简化作为组织代码的一种方式。

于 2013-01-09T14:41:34.237 回答