2017-05-09 47 views
1

我們可以傳遞對象來枚舉抽象方法並在枚舉中進行計算嗎?這是一個場景,我有四個常量,每個都有自己的值。基於常量,我將在我的方法中進行計算。相反,我想在枚舉中進行計算並希望得到響應。在枚舉中進行計算,我必須將兩個/三個參考對象傳遞給枚舉方法...枚舉做計算

ex:考慮學校爲枚舉,常量是TEACHER(LOWLEVELACCESS),STUDENT(NOACCESS),OFFICEADMIN(OFFICEACCESS)。

在枚舉,我有抽象方法過程其接收用戶POJO,字符串作爲參數,並更新在對象的某些字段和返回相同的USER POJO(與更新的)給調用者。通過這個,我可以在枚舉本身中同步常量和它們的邏輯。

所以我的問題,

  1. 它是正常的有枚舉此實現? (我已經看到大多數的例子對待枚舉來存儲常量值而不使用它們進行任何計算)

  2. 這個計算可以通過類中的方法來完成,如果我在枚舉方法中進行計算,有什麼好處?

  3. 是否有可能在enum中創建getter/setter方法?

在此先感謝!

+1

你可以發佈一些(僞)代碼後,你是什麼?基本上你可以添加方法來枚舉並在那裏進行計算,但它會讓我覺得它是一種設計氣味(至少不知道更多)。 – Thomas

+0

@Thomas我同意關於潛在的設計氣味。我不會一概而論,但我認爲,如果您以這種方式利用枚舉,可能會出現這種情況。 – davidxxx

+0

枚舉常量具有行爲是完全可以接受和習慣的。認爲「代碼味道」就是否定自己90%的枚舉能力。 –

回答

5

恕我直言:

  1. 它是正常的有枚舉此實現?

是的 - 我一直這樣做。

enum Ops implements Op { 
    Nop{ 
     @Override 
     public int filter(int old, int now) { 
      // Unchanged. 
      return now; 
     } 
    }, 
    Diff{ 
     @Override 
     public int filter(int old, int now) { 
      return a(now) 
        | (Colour.MidGrey + (r(now) - r(old))) << 16 
        | (Colour.MidGrey + (g(now) - g(old))) << 8 
        | (Colour.MidGrey + (b(now) - b(old))); 
     } 
    }; 
} 
  • 這種計算可以通過在類中使用方法做了,有什麼好處,如果我做枚舉法的計算?
  • 的功能的代碼在一個地方。這總是一件好事。

    1. 是否可以在枚舉中創建getter/setter方法?

    是 - 但不要。請記住,在代碼的整個生命週期中,每個enum都有一個一個實例。在全局對象上添加/刪除功能很可能會在以後傷害你。

    +0

    嗨@OldCurmudgeon,我想問一下「每個枚舉的一個實例的意思是什麼」。例如:如果我有像枚舉水果那樣的枚舉{ } \t APPLE,ORANGE; },這裏將創建兩個枚舉實例嗎?一個是fruits.APPLE&fruits.ORANGE –

    +0

    @prababuddy - 這意味着有一個** APPLE,無論你在哪裏使用它。例如。如果你允許'APPLE.setColour(..)'那麼**所有**蘋果都會改變顏色。 – OldCurmudgeon

    4

    這個實現在枚舉中可以嗎?

    這是一個設計選擇。
    Enum帶來一些advdantanges提供服務操作。
    Enum值是開箱即用的單例,這些都是自解釋性的,有記憶效率等等,但也有一些限制,你不能直接從枚舉中派生出來,所以你應該在枚舉後面引入一個接口,如果你希望能夠測試您的代碼並避免將執行計算的客戶端類與枚舉耦合...如果稍後您改變了關於枚舉用法的想法。

    這種計算可以通過在類中使用的方法來完成,什麼是 好處,如果我這樣做枚舉法的計算?

    你在對象方面的原因。您不需要在代碼中創建服務和間接尋址,因爲作爲域對象的枚舉執行計算。
    枚舉值和相關的處理構成了同樣的問題。所以,收集它們不是一個難聞的氣味。
    儘管如此,請注意如果您開始編寫大量在枚舉方法中做了非常不同的事情的處理,您應該將它們排除在枚舉之外。
    這是一種難聞的氣味,因爲枚舉不應該成爲上帝的對象。

    是否可以在枚舉中創建getter/setter方法?

    提供數據,是的,但設置枚舉的數據:不,你不能。
    否則,您會構建一個有狀態的服務,並冒着完成同步問題的風險。

    +0

    Hi @davidxxx,只是爲了解枚舉水果{APPLE,ORANGE; }根據我的理解,這裏創建了兩個枚舉實例,它們被認爲是單例。如果有任何問題,請糾正我的內容。因此,問題是枚舉實例內部是什麼? –

    +0

    你好,我不知道你的問題。抱歉。 – davidxxx

    +0

    感謝您的回覆..我儘量讓問題更簡單...例如:enum fruits {APPLE,ORANGE; }將爲此枚舉創建多少個實例?如果兩個實例將被創建,我們怎麼能說枚舉是單身? –

    0

    枚舉被定義爲final。只要結果對於相同的輸入是相等的,就允許計算。 您也可以修改輸入實例,但不應在枚舉中定義任何setter,因爲在這種情況下枚舉不是不可變的。

    另請參見Example 8.9.2-4 here