我需要建议在Java中应用条件的正确方法。
我有100个条件,我必须根据这些条件更改将显示给用户的String变量的值。
示例条件:a<5 && (b>0 && c>8) && d>9 || x!=4
存在更多条件,但变量或多或少相同。
我现在正在这样做:
if(condition1)
else if(condition2)
else if(condition3)
...
切换案例替代方案显然会嵌套在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有/无嵌套。在这种情况下,处理会变慢。
我现在将消息存储在一个单独的类中,其中包含我保持静态的各种字符串变量,如果条件为真 然后我从唯一的类中选择静态变量并显示它 一。这对于存储结果消息是否正确。
答案 0 :(得分: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
意大利面条代码,这可能会提高性能。
如果您在问题中添加了更多上下文,我们可能会为您提供更多帮助。条件输入来自哪里?他们喜欢什么?
更重要的问题是:What is the actual problem that you are trying to solve?
答案 1 :(得分:4)
这有很多可能性。在不了解您的域名的情况下,我会创建类似的东西(您可以想到更好的名字:P)
public interface UserFriendlyMessageBuilder {
boolean meetCondition(FooObjectWithArguments args);
String transform(String rawMessage);
}
通过这种方式,您可以创建一个Set
UserFriendlyMessageBuilder
,并在第一个符合条件的情况下迭代它们以转换原始邮件。
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;
}
}
答案 2 :(得分:0)
在我看来,#34;您在模块中设计产品的重要性非常低。 哪个是使用OOP语言的主要因素。
例如:如果您有100个条件并且您可以制作4个模块,那么可以选择任何可供选择的条件。
答案 3 :(得分:0)
这是另一种可能值得考虑的可能性。
进行每次比较,并计算其真相,然后在真值表中查看结果boolean []。您可以应用simplifying truth tables上的大量现有工作。我有一个真值表简化applet我多年前写过。您可能会发现它的源代码很有用。
这样做的成本是进行所有比较,或者至少是使用简化真值表评估表达式所需的比较。优点是有组织的系统,用于管理复杂的条件组合。
即使您不直接在代码中使用真值表,也可以考虑编写和简化一个真值表作为组织代码的方式。