2017-05-09 8 views
1

オブジェクトを抽象メソッドに渡し、列挙型で計算することはできますか?ここにシナリオがあり、4つの定数があり、それぞれに独自の値が割り当てられています。定数に基づいて、私の方法で計算を行います。代わりに、計算をenumで行いたいと思い、応答を得たいと思います。列挙型で計算を行うには、enumメソッドに2つまたは3つの参照オブジェクトを渡す必要があります。計算を行うenums

例:学校は列挙型で、定数はTEACHER(LOWLEVELACCESS)、STUDENT(NOACCESS)、OFFICEADMIN(OFFICEACCESS)です。列挙で

、Iは、引数として文字列をユーザーPOJOを受信し、オブジェクトの一部のフィールドを更新し、呼び出し元に同じユーザー(更新で)POJOを返している抽象メソッドプロセスを有します。これによって、定数とその論理を列挙型で同期させることができます。

だから私の質問、

  1. が列挙型で、この実装を持っている、それは大丈夫ですか? (私はほとんどの例で、列挙型を扱っていて、計算に使用しない定数を格納しているのを見てきました)この計算はクラス内のメソッドを使って行うことができます。

  2. enumでゲッター/セッターメソッドを作成することはできますか?

ありがとうございました!!

+1

あなたは後にしているものにいくつかの(擬似)コードを投稿することができますか?基本的には、列挙型にメソッドを追加してそこで計算しますが、デザインの匂いとして私を襲ってしまいます。 – Thomas

+0

@Thomas私は潜在的なデザインのにおいについて同意します。私は一般化しませんが、あなたがこのようにenumを悪用すれば事実かもしれないと思います。 – davidxxx

+0

enum定数が振る舞いを持つことは、まったく受け入れられ、慣用的です。 「コードの匂い」は列挙型の力の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. 列挙型でゲッター/セッターメソッドを作成することはできますか?

    はい - ただし、できません。 の各インスタンスがenumのコードの生涯にわたって存在することに注意してください。グローバルオブジェクトに機能を追加/削除すると、後であなたを傷つける可能性が非常に高いです。

    +0

    こんにちは@OldCurmudgeon、私は "ライフタイムの各列挙型の1つのインスタンスで何を意味しているのですか"と尋ねたいと思います.. ex:enumのフルーツのようなenumを持っている場合{ \t APPLE、ORANGE; }、ここでは列挙型の2つのインスタンスが正しく作成されますか? 1つは果物です.APPLE&fruits.ORANGE –

    +0

    @prababuddy - それはあなたがどこにいても、** 1 ** ** APPLEです。例えば。 'APPLE.setColour(..)'を許可すると**すべての**リンゴは色が変わります。 – OldCurmudgeon

    4

    この実装を列挙型にしても問題ありませんか?

    デザインの選択です。
    Enumには、サービス操作を提供するためのいくつかのアドバンテージがあります。
    列挙型の値は、そのままの状態でのシングルトンです。これらは自明であり、効率的なメモリなどがありますが、いくつかの制限があります。列挙型から直接派生することはできません。あなたのコードをテストし、計算を行うクライアントクラスを列挙型と連結しないようにしたいとします。

    この計算は、クラスのメソッドを使用して行うことができ、私は列挙法で計算を行う場合、 利点は何ですか?

    理由はオブジェクトの点でです。ドメインオブジェクトである列挙型は計算を行うので、コード内でサービスと間接を作成する必要はありません。
    関連する列挙型の値と処理は同じ懸念の一部です。だから、それらを集めることは悪い匂いである必要はありません。
    しかし、あなたがenumメソッドで非常に異なったことをするたくさんの処理を書くようになったら、おそらくenumからそれらを取り出すべきです、に気をつけてください。
    enumが神のオブジェクトになるべきではないので、これは悪い匂いです。

    enumでゲッター/セッターメソッドを作成することはできますか?

    データを提供しますが、はい、ただし列挙型のデータを設定します:いいえ、そうしてはいけません。
    そうしないと、ステートフルなサービスが構築され、同期に関する懸念が生じる危険があります。

    +0

    こんにちは@davidxxx、ちょうどエナムフルーツを理解するために{APPLE、ORANGE; }、私の理解によれば、ここではenumの2つのインスタンスが作成され、それらはシングルトンとみなされます。何か間違っている場合は、私の補足を修正してください。質問は列挙型インスタンスの内部にあるのですか? –

    +0

    こんにちは、私はあなたの質問を理解することはできません。ごめんなさい。 – davidxxx

    +0

    返信ありがとう..私は質問をよりシンプルにしようとしています...例:列挙型の果実{APPLE、ORANGE; }この列挙体にはいくつのインスタンスが作成されますか? 2つのインスタンスが作成される場合、どのようにenumがシングルトンであると言うことができますか? –

    0

    列挙は最終的に定義されます。計算結果は、同じ入力に対して等しい場合に限り許可されます。 入力インスタンスを変更することもできますが、その場合はenumが不変ではないため、enumにセッターを定義しないでください。

    も参照してくださいExample 8.9.2-4 here