「きれいな」と考え列挙型の関数の内部を提供していますか?

マルタインP:

私は基本的に列挙のすべての可能な値を通過し、データ型に基づいて、Numberオブジェクトを返す適切な機能を呼び出すために、スイッチケースを使用するソースにいくつかのコードを発見しました。

ここでスニペットは次のとおりです。

case TYPE_16BIT_SIGNED_BE:
    measurement = response.getRegisters().getShort(0);
    break;
case TYPE_16BIT_UNSIGNED_BE:
    measurement = response.getRegisters().getUnsignedShort(0);
    break;
case TYPE_16BIT_SIGNED_LE:
    measurement = response.getRegisters().getShortLE(0);
    break;

今、私の質問は、それ自体が良いか悪い習慣であると考えられて列挙にこれを追加していますか?

ここで私が何を意味するかの例は次のとおりです。

public enum SomethingType {
    INT((b) -> {
        return b.getInt(0);
    }),
    DOUBLE((b) -> {
        return b.getDouble(0);
    }),
    LONG((b) -> {
        return b.getLong(0);
    });

    private Function<ByteBuf, Number> getNumber;

    SomethingType(Function<ByteBuf, Number> getNumber) {
        this.getNumber = getNumber;
    }
}
güriösä:

一つは、昇格、このアプローチを見つけることができますすべての種類 の場所の、可能性の高い防御例であるステート・マシン列挙型のメンバーもずっと後に採用されたScalaの言語そのよう明確にするJavaのない異常な機能はなかったが、有用であることが判明したものを希望。私は個人的に列挙型の値または列挙型から機能まで、いくつかの静的マッピングが必要になった場合は特に、再び量産コードの時間とでそれを使用しました。それはしっかりと構造化、簡潔なコードが可能になります。

さらにIMO説得力Iからビットを除去することができる場合ラムダの使用は、最初の質問で提示方法は、オーバーライドされたメソッドの使用よりも好ましいことが示されたヨハネス・キューン@によって提供されたリンク

したがって、私は、それが(良い習慣と考えられていると主張しているん「クリーン」ではなく悪いものよりM.FowlerとR.Martinの意味で)。それが明示的に考えられていない場合や、それがなければなりません。

それはそこに永続的なコメントがある、と述べきれいにならないような列挙型を考える(:コードのにおい、きれいなのかもしれない反対正確に)、それらがきれいではありませんスイッチ・ステートメントを使用してにあなたを誘惑するという事実のためには、 、「のM.Fowlers初版を参照リファクタリング:既存のコードのデザインを改善します」。そして、あなたが知っている、それは「クリーン」(および「コードのにおい」)用語をcoinded者は彼でした。しかし、中に2005年版、彼はこの判決を撤回しました。

スイッチの通り:1あなたが列挙型を拡張し、すべてがあまりにもスイッチを延長することを忘れたときにどうなるかを考慮しなければなりません。私と私の同僚は、列挙型のすべてのアイテムをループしてテストし、何を確保するために必要とされたことを、ユニットテストを導入することが有用であることが判明しました。その問題は、ラムダによって強化列挙型のために別の引数を与える:あなたは、いくつかのケースでは、スイッチを惜しますることができます(switch someValue ... case Enum.x: dosmthg())マップされた関数を呼び出すの賛成で(someValue.dosmthg())。

下のこの質問を包摂するための提案については式問題

精密検査の下では、問題はまったく問題に関連している数式のようには見えません。リンクから:"The Expression Problem is a new name for an old problem. The goal is to define a datatype by cases, where one can add new cases to the datatype and new functions over the datatype, without recompiling existing code, and while retaining static type safety (e.g., no casts)."

したがって、1はアプローチのAとBのアプローチと表現の問題を持つことができない提案のように、同じ方法の一つは持つことができませんHadwiger・ネルソン問題彼らとを。式問題は、それ自体で問題と、ここで与えられたように文脈から独立して、それらのそれぞれに個別のソリューションとの機能的なオブジェクト指向言語のためのパズルゲームです。ここだ示すJavaソリューションクレームはHaskellのソリューションと一緒に、完全かつ有効の両方であることをことを。非常に複雑なものをacutally。

私が間違っている場合は、私を殺します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313321&siteId=1