我有以下代码:
void f(String t)
{
if(t.equals("a"))
{
someObject.setType(ObjectType.TYPE_A);
}
else if(t.equals("b"))
{
someObject.setType(ObjectType.TYPE_B);
}
// 50 more similar code
}
是否有任何简单的方法来重写 if-else 条件以免有那么多代码?
我有以下代码:
void f(String t)
{
if(t.equals("a"))
{
someObject.setType(ObjectType.TYPE_A);
}
else if(t.equals("b"))
{
someObject.setType(ObjectType.TYPE_B);
}
// 50 more similar code
}
是否有任何简单的方法来重写 if-else 条件以免有那么多代码?
您应该使用一些东西来消除someObject.setType(ObjectType....))
If ObjectType
is an的重复enum
,然后在那里编写一个类似的方法来valueOf
实现这一点。看看你是否喜欢这种解决方案:
void f(String t) { someObject.setType(ObjectType.byName(t)); }
enum ObjectType {
TYPE_A, TYPE_B;
public static ObjectType byName(String name) {
return valueOf("TYPE_" + name.toUpperCase());
}
}
使用一个Map
(您必须填充)映射到您的值的String
任何类型。ObjectType.TYPE_x
我会将其添加为枚举的功能:
public enum ObjectType {
TYPE_A("a"),
TYPE_B("b");
private String stringType;
private ObjectType(String stringType) {
this.stringType = stringType;
}
public String getStringType() {
return this.stringType;
}
public static ObjectType fromStringType(String s) {
for (ObjectType type : ObjectType.values()) {
if (type.stringType.equals(s)) {
return type;
}
}
throw new IllegalArgumentException("No ObjectType with stringType " + s);
}
}
...
void f(String t) {
someObject.setType(ObjectType.fromStringType(t));
}
如果您可以重构t
为 a char
,则可以switch
改用(Java 6):
void f(char t) {
switch(t) {
case 'a`:
someObject.setType(ObjectType.TYPE_A);
break;
case 'b':
someObject.setType(ObjectType.TYPE_B);
break;
// ...
}
}
正如 Marko 所指出的,您也可以String
在 Java 7 中使用。
它没有那么短,但更优雅。此外,我认为它也可能更快,因为它switch
与O(1)
跳转表(有人可以确认这是否是真的?),是否一些if
语句是O(n)
.
对于更复杂的实现,setType
您可能还会想到状态模式实现。
1.如果if条件数超过3个,可以选择switch语句。
2.你可以将你的if else语句转换为三元运算
其他建议很棒——尤其是更智能的枚举和映射。但是我在这里要解决的第一个最基本的重构是提取一个方法来直接返回枚举,并让调用者只对该方法的返回值执行 setType。
void f(String t) {
final ObjectType type = findType(t);
if (type != null)
someObject.setType(type);
}
ObjectType findType(String t) {
if (t.equals("a")) return ObjectType.TYPE_A;
if (t.equals("b")) return ObjectType.TYPE_B;
// 50 more similar code
}
在某些情况下,这本身就足够了;在其他情况下,该findType()
方法可能会引导您使用简单的基于映射或枚举的解决方案。