2016-04-23 48 views
1

我有一種情況,我覺得我做錯了什麼,我懷疑有更多的方法可以做到。當成員與另一個類的公共變量相同時使用Enum

我有一些變量的類:

public class Structure { 
    public float size; 
    public float pos_x; 
    public float pos_y; 
    public float pos_z; 
} 

我必須跟這些構件,其是完全一樣的上述領域的枚舉:

public enum StructureProperty { 
    SIZE, 
    POS_X, 
    POS_Y, 
    POS_Z, 
} 

我有AnotherClass需要存儲單個StructureProperty及其關聯的值。

public class AnotherClass { 
    public StructureProperty property; 
    public float value; 
    public float ID; 
    public float parentID; 
    ..some methods and things 
} 

我有抓住這個其他類,並期待看到使用枚舉來更新其屬性的方法:

void UpdateStructure (AnotherClass anotherClassInstance) { 
    switch (anotherClassInstance.property) { 

    case StructureProperty.SIZE: 
     Structure.size += anotherClassInstance.value; 
     break; 

    ... for all other cases 
    but the logic might be different 
    (not always +=, sometimes several lines) 

} 

這種方法需要進行檢查,看在結構上要更新的屬性,然後更新它。我覺得我可能會在這裏打破某種面向對象的方法,因爲我需要在Structure中維護一個枚舉列表和一個變量列表。請注意,我預計在構建程序時經常添加和刪除屬性。希望有人能引導我以正確的方式讓這個代碼更具前瞻性。

我在c#編程,但我認爲這個問題適用於所有主要的OO編程語言。

感謝。

+0

不是很清楚你想要做什麼...也許使用更新特定屬性而不是枚舉值的代理集可以工作。從原始CPU速度的角度來看,這種方法的效率明顯低於對結構字段的直接操作,但至少具有更多的可擴展性。如果使用它,請注意複製的結構 - 您可能需要在任何地方撒上'ref'。 –

+0

謝謝,我怎樣才能更清楚我想做什麼?我可以更新這個問題,我只是想知道什麼是不明確的。我會查看結構字段,以前從未使用它們。 –

+0

問題在於您描述了代碼的功能,但不是您想要實現的功能 - 所以建議僅限於對您所擁有的內容進行微小更改,而不是您可能要查找的實際問題的其他方法。 –

回答

2

我從回答這個直接使用這些Java的立場。我相信c#會有類似的結構。我沒有看到維護一個Structure類和一個StructureProperty枚舉的必要性。假設這些屬性需要在運行時修改,並且沒有將它們存儲在屬性文件中的用例,我認爲Structure和StructureProperty可以合併爲一個Enum。

這裏是你怎麼會想到那個方向:

public class StructurePropertyExample { 

private static enum StructureProperty { 

    SIZE(0.0f), POS_X(0.0f), POS_Y(0.0f), POS_Z(0.0f); 

    private float value; 

    private StructureProperty(float value) { 
     this.value = value; 
    } 

    public float getValue() { 
     return value; 
    } 

    public void setValue(float value) { 
     this.value = value; 
    } 
}; 

public static void main(String[] args) { 

    float newValue = 1.23f; 

    for (StructureProperty property : StructureProperty.values()) { 
     switch (property) { 
      case SIZE: property.setValue(newValue); 
         break; 
      case POS_X : // similar as above 
      case POS_Y : 
      case POS_Z : 
     } 
    } 

} 

}

在我們談論不同的數據類型的情況下,枚舉可改爲如下保持包裝的對象:

private static enum StructureProperty { 

    SIZE, POS_X, POS_Y, POS_Z; 

    private Object value; 

    public Object getValue() { 
     return value; 
    } 

    public void setValue(Object value) { 
     this.value = value; 
    } 
}; 
+0

令人驚歎!你知道有沒有辦法爲這個價值設定不同的類型?像有一些價值整數,其他浮動? –

+0

不幸的是,在Java中,枚舉不支持動態類型聲明。根據你的問題,我認爲你只需要照顧浮點值。如果你有支持各種類型的需求,那麼你將不得不把這些原始物打包成Object。例如,你可以把一個int作爲一個Integer來包裝。我用一個新建議編輯了答案。 – Partha

+0

嗨Partha,我發佈了一個與這個密切相關的新問題,但是關於另一個問題。我想知道你是否可以請看看! http://stackoverflow.com/q/36881443/4163879 –

1

就我個人而言,我沒有發現Sturcture類和定義枚舉的問題。我發現AnotherClass有問題,即它包含了不必要的屬性,這些屬性可能永遠不會被使用,這取決於您的StructureProperty枚舉。所以我寧願將這個AnotherClass分解爲specefic StructureUpdater類,並實例化特定的Updater類(可能是使用Factory)來更新結構。

另一種方法可以是寫在結構類本身來更新它像

public static class StructureExtensions 
{ 
    public static void UpdateSize(this Structure structure, float size) 
    { 
     structure.size += size; 
    } 

    public static void UpdateX(this Structure structure, float x) 
    { 
     structure.pos_x += x; 
     //any other update on strucutre 

    } 
} 

擴展方法,然後你可以在結構本身

 Structure structure = new Structure(); 
     structure.UpdateSize(123); 
     structure.UpdateX(34); 
+0

把方法放在裏面是個好主意。但是我的枚舉設置的問題是,如果我需要添加/刪除一個新的屬性,我需要在兩個地方添加它。我記得當我第一次學習被認爲是非諾諾的編程時。 –

相關問題