我正在编写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语句。