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

Man*_*shi 0 java oop enums design-patterns 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

sig*_*ned 5

"正确"的答案可能是继承.我会在这里提供其他几个选项,只是为了完整性.

继承示例

这可能是"正确"的答案.

PROS

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

缺点

  • 实现必须耦合到特定接口

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());
Run Code Online (Sandbox Code Playgroud)

反思范例

PROS

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

缺点

  • 没有编译时检查

// 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);
}
Run Code Online (Sandbox Code Playgroud)

枚举示例

PROS

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

缺点

  • 重复
  • 详细

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));
}
Run Code Online (Sandbox Code Playgroud)