2014-07-23 63 views
0

我有兩個對象說對象a和對象b。這兩個對象都有一些屬性,比如名稱,年齡等。我想寫一個方法,將一些字符串值作爲參數傳遞給此方法,併爲這兩個對象打印一些值。要打印的值由正在傳遞給方法的字符串決定。要更清楚: -字符串開關在OOP中的實現替代

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語句來完成這項工作。但我已經讀過,switch語句對於OO設計並不是一個好習慣。我能做到這些的其他方式是什麼?我已閱讀了關於使用枚舉的一些信息,但我對此不太清楚。

+1

我不明白爲什麼交換機不會是很好的做法,OOP或沒有。 – AntonH

+0

與您的問題無關,但是A和B類相同?因爲這不會是很好的OO設計。 –

+0

我已閱讀了關於此的幾個討論,所以我只是想知道還有什麼其他替代品可用。這是其中一個討論: - http://stackoverflow.com/questions/550919/does-anyone-disagree-with-the-statement-using-switch-is-bad-oop-style –

回答

5

「正確的」答案可能是繼承。爲了完整起見,我會在這裏列出其他一些選項。

繼承示例

這大概是 「正確」 的答案。

PROS

  • 編譯時檢查
  • 大多數 「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()); 

反思例

的觀光

  • 簡單
  • 沒有繼承關係需要
  • 有點感激對象(一)行爲類似的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); 
} 

枚舉實例

的觀光

  • 編譯時檢查
  • 容易隨着時間的推移添加字段或對象
  • 沒有繼承關係需要
  • 可以很容易地把一個字段作爲參數

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)); 
} 
+1

+1對於所有三個非常好的例證。 –

+1

好的解釋!謝謝! –