1

コレクションのおかげで、クラスの単一のインスタンスで十分な状況が時々思いつきます。例は私の Decoder クラスです:

public class Decoder
{

    private static final Decoder instance = new Decoder();
    private final HashMap<Client, State> states = new HashMap<Client, State>();

    private Decoder()
    {

    }

    public Packet decode(Client client, ByteBuffer data)
    {
            return null;
    }
}

しかし、私は考えていました。

public class Decoder
{

    private static final HashMap<Client, State> states = new HashMap<Client, State>();

    public static Packet decode(Client client, ByteBuffer data)
    {
            return null;
    }
}

どちらの設計でも、効果的に同じことを達成できます。2つに実際的な違いはありますか?いつどちらを使用するのですか?ありがとう。

4

3 に答える 3

3

Decodera (またはその他の「ユーティリティ」オブジェクト)を使用するクラスを単体テストする場合は、モック アウトすることをお勧めします。つまりDecoder、動作がわかっているダミー オブジェクトで を置き換えます。Decoderそうすれば、クラスが変更 されても単体テストが壊れることはありません。

Decoderが実際のオブジェクトである場合、これははるかに簡単に達成できます。が静的メソッドでいっぱいのクラスである場合、Decoder実際には簡単にモックすることはできません (ただし、バイト コードをいじることでこれを実現できるモック フレームワークがあります)。

要するに、静的メソッドはテスト容易性のアンチパターンです。絶対に避けることを強くお勧めします。これについてもっと読みたい場合は、http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/を試してください- このサイトには、テスト容易性に関する他の良いアドバイスがたくさんありますそれも。

于 2012-04-28T05:46:20.360 に答える
1

たとえば、インスタンスをモックアウトしたり置き換えたりできるように、インターフェイスを実装する必要がない限り、すべての静的メソッドを使用します。

public enum Decoder implements IDecoder {
    INSTANCE;

    private final Map<Client, State> states = new HashMap<Client, State>();

    public Packet decode(Client client, ByteBuffer data) {
            return null;
    }
}

また

public enum Decoder {;
    private static final Map<Client, State> states = new HashMap<Client, State>();

    public static Packet decode(Client client, ByteBuffer data) {
            return null;
    }
}
于 2012-04-28T07:38:35.620 に答える
1

クライアントクラスでコーディングすると、静的メソッドを使用する方が短いと思いますが、

public class Collections {
   // Suppresses default constructor, ensuring non-instantiability.
   private Collections() {
   }

   public static <T extends Comparable<? super T>> void sort(List<T> list) {
       ...
   }
}

次に、

Collections.sort(list);
于 2012-04-28T05:40:56.897 に答える