代码优化:对特定字符串的整数值求和,



我正在编写Java - ME (Java ME 3.2) MIDlet,其中我使用模式,风扇和温度变量(这一个很简单)。当我将信息发送到web API时,我必须将它们更改为十六进制值,因为API将它们读取为位。对web API的响应是这种格式:AABBCCAA:模式- 8位(自动,低,冷,风,热,N/A,N/A,OnOff)BB:风扇速度- 8位(自动,低,Med,高,N/A,N/A,N/A,N/A)CC:温度-整型

因此,为了生成此响应,目前我使用此代码。但它可能更短或更简单。那么我该如何优化这段代码呢?

int firstPart = 0;
    int seccondPart = 0;
    if(climateOn)
    {
        firstPart += 128;
    }
    if(mode.equals("HEAT"))
    {
        firstPart += 16;
    }
    if(mode.equals("WIND"))
    {
        firstPart += 8;
    }
    if(mode.equals("COOL"))
    {
        firstPart += 4;
    }
    if(mode.equals("LOW"))
    {
        firstPart += 2;
    }
    if(mode.equals("AUTO"))
    {
        firstPart += 1;
    }
    if(fanSpeed.equals("HIGH"))
    {
        seccondPart += 8;
    }
    if(fanSpeed.equals("MED"))
    {
        seccondPart += 4;
    }
    if(fanSpeed.equals("LOW"))
    {
        seccondPart += 2;
    }
    if(fanSpeed.equals("AUTO"))
    {
        seccondPart += 1;
    }
    return Integer.toHexString(firstPart) + ""  + Integer.toHexString(seccondPart) + "" +(setTemperature + 19);

如果您使用的是Java 7或更高版本,您可以使用switch语句:

switch (mode) {
    case "HEAT": firstPart += 16; break;
    case "WIND": firstPart += 8; break;
    // ...
}

另一个解决方案是将这些数据放在map中:

static final Map<String, Integer> modes = new HashMap<>();
static {
    modes.put("HEAT", 16);
    modes.put("WIND", 8);
    // ...
}
void someMethod(String mode) {
    // ...
    if (modes.containsKey(mode))
        firstPart += modes.get(mode);
}

你也可以像这样使用枚举:

enum Mode {
    HEAT(16), WIND(8), COOL(4), LOW(2), AUTO(1);
    private final int value;
    private Mode(int value) { this.value = value; }
    public int getValue() {return value;}
}
void someMethod() {
    // ...
    Mode mode = Mode.valueOf(str); // finds the named element. throws IllegalArgumentException
    firstPart += mode.getValue();
}

[编辑]你甚至可以用枚举做得更好:

enum Mode {
    AUTO, LOW, COOL, WIND, HEAT;
    public int getValue() { return 1 << ordinal(); }
}

ordinal()方法返回枚举中特定常数的序数,从0开始。这意味着对于AUTO,它将返回0,对于LOW,它将返回1,等等。1 << N是一种快速计算2 ^ n的方法

这样做的好处是,它会自动生成正确的值(假设顺序正确),并且不会为两个枚举生成相同的值。

用法与以前的enum实现相同。

你读过java枚举吗?下面是一个例子:

public enum Mode {
  Auto,Low,Cool,Wind,Heat,NA,OnOff;
}

枚举可用于switch语句。

相关内容

  • 没有找到相关文章

最新更新