我正在编写jave-me(Java ME 3.2)MIDlet,其中我使用Mode,Fan和Temperature的变量(这很简单)。当我向Web API发送信息时,我必须将它们更改为十六进制值,因为API将它们作为位读取。 对Web API的响应采用以下格式:AABBCC AA:模式 - 8位(自动,低,冷,风,热,N / A,N / A,OnOff) BB:fanSpeed - 8位(自动,低,中,高,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);
答案 0 :(得分:1)
如果您使用的是Java 7或更高版本,则可以使用switch
声明:
switch (mode) {
case "HEAT": firstPart += 16; break;
case "WIND": firstPart += 8; break;
// ...
}
另一个解决方案是将这些数据放在地图中:
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的快速方法。
关于这一点的好处是,它会自动生成正确的值(假设顺序正确),并且它不会为两个枚举产生相同的值。
用法与之前的枚举实现相同。
答案 1 :(得分:0)
您是否了解过java enums?这是一个例子:
public enum Mode {
Auto,Low,Cool,Wind,Heat,NA,OnOff;
}
枚举可以在switch语句中使用。
此外,您也可以为每个值分配一个字节值。