字符串切换OOP中的实现替代方案

时间:2014-07-23 19:12:29

标签: java oop design-patterns enums switch-statement

我有两个对象,比如对象a和对象b。这两个对象都有一些属性,如名称,年龄等。我想写一个方法,我将一些字符串值作为参数传递给此方法,并为两个对象打印一些值。要打印的值由传递给方法的String决定。更清楚: -

Class A{
String name;
String age;
//getters and setters for name and age
}

Class B{ 
String salary;
String level;
//getters and setters for name and age
}




public String getValue(String attribute)
{
    switch(attribute)
    {
        case "name":
        System.out.println(a.getName());
        System.out.println(b.getSalary());
        break;
        case "age":
        System.out.println(a.getAge());
        System.out.println(b.getLevel());
        break;
    }
}

现在使用switch语句完成这项工作。但我已经读过,切换语句对于OO设计来说不是一个好习惯。我能做到这一点的其他方法是什么?我已经阅读了有关使用枚举的内容,但我对此并不十分清楚。

1 个答案:

答案 0 :(得分:5)

“正确”的答案可能是继承。我会在这里添加其他几个选项,只是为了完整性。

继承示例

这可能是“正确”的答案。

<强>赞成

  • 编译时检查
  • 大多数“OO”解决方案

<强> CONS

  • 实现必须与特定接口相结合

public interface X {
    public Object getField1();
    public Object getField2();
}

public class A implements X {
    /* implementation... */
}

public class A implements X {
    /* implementation... */
}

X x=create();
System.out.println(x.getField1());
System.out.println(x.getField2());

反射示例

<强>赞成

  • 简单
  • 不需要继承关系
  • 对某些对象感兴趣(a)表现得像具有适当访问者名称的Java bean; (b)有公共领域;或(c)制定允许拨打setAccessible()
  • 的安全政策

<强> CONS

  • 无编译时检查

// Note that we're accessing fields directly. You should probably use accessor methods instead.
Object x=create();
for(String name : new String[]{"all", "your", "fields"}) {
    Field field=x.getClass().getField(name);
    Object value=field.get(x);
    System.out.println(name+" = "+value);
}

枚举示例

<强>赞成

  • 编译时间检查
  • 随着时间的推移轻松添加字段或对象
  • 不需要继承关系
  • 将字段视为参数
  • 很容易

<强> CONS

  • 重复
  • 冗长

enum Value {
    FIELD1 {
        public Object get(A a) {
            return a.field1;
        }

        public Object get(B b) {
            return b.field1;
        }
    }, ...;

    public abstract Object get(A a);

    public abstract Object get(B b);

};

A a=create();
B b=create();
for(Value value : Value.values()) {
    System.out.println(value.get(a));
    System.out.println(value.get(b));
}