压缩控制块Java

时间:2017-04-25 00:47:12

标签: java

我想知道我是否可以压缩我的if控制块:

    //HUNGER
    if(hungerLvl > 0){
        hunger = "Peckish";
    }
    if(hungerLvl > 50){
        hunger = "Very Hungry";
    }
    if(hungerLvl > 80) {
        hunger = "Starving";
    }

对于这样的事情:

if(hungerLvl > 0; hungerLvl > 50; hungerLvl > 80) {

    }

3 个答案:

答案 0 :(得分:0)

我非常喜欢使用数据结构+循环而不是重复代码。也就是说,这可能会增加有时候不值得的复杂性。

您发布的内容看起来很容易阅读,因此可能不值得大惊小怪。但是,如果您最终可能会遇到数十个或数百个条件,那么数据结构+循环将为您提供更好的服务。

这是一个完整的工作示例,使用相同的值。关键方法-rewards_tracker_type character varying DEFAULT 'rewards_tracker'::character varying, +rewards_tracker_type character varying DEFAULT 'rewards_tracker'::text, 既不比3范围示例更紧凑也更易读。但是,如果你进入10或20个条件,那么这个,恕我直言,将更易于维护和更具可读性。

howHungry

答案 1 :(得分:0)

除了普通的“if”之外还有其他一些方法 - 但是他们中的大多数仍然在引擎盖下使用它(如果你喜欢你可以google例如chain of responsibility pattern)但是在你的情况下它只会是过于复杂,你将不得不写更多,更不易读的代码。 所以我认为在这个特殊情况下'if'语句是要走的路。

如果你担心速度,那么你可能应该看看你做变量赋值的次数(如果你经常检查hungerLvl就可能很重要):

    //HUNGER
if(hungerLvl > 0){
    hunger = "Peckish";
}
if(hungerLvl > 50){
    hunger = "Very Hungry";
}
if(hungerLvl > 80){
    hunger = "Starving";
}

在您的代码中,无论先前结果如何,都会执行每个值检查。因此,如果hungerLvl等于例如92,那么首先检查hungerLvl> 0将发生,然后饥饿将被赋予“Peckish”的值,然后它将检查下一个if语句,进行下一个赋值,然后它最终将检查最大值并进行最终赋值。 所以你有三个作业而不是最后一个作业。

为了防止这种情况,您可以使用'if else'块并略微更改逻辑表达式(我假设hungerLvl不能低于0 - 如果可以,它会产生一些差异,您将不得不添加额外的检查在开始):

if(hungerLvl <= 50){
    hunger = "Peckish";
} else
if(hungerLvl <= 80){
    hunger = "Very Hungry";
} else
{
    hunger = "Starving";
}

请注意,现在如果第一个语句为true,那么'if else'块中'else'之后的所有内容都将被忽略。此外,如果hungerLvl的值更大,例如92,那么它将执行更低值的检查,但不会进行任何分配,因为检查将返回false。

奖励点是,如果值不低于50或80,那么我们不必检查它是否更高,所以我们有一个if语句更少。

答案 2 :(得分:0)

你可以这样写:

hunger = hungerLvl > 80 ? "Starving"
        : hungerLvl > 50 ? "Very Hungry"
        : hungerLvl > 0 ? "Peckish"
        : hunger; // or null, or whatever