0

サブタイプ階層に同じ「レベル」のクラスがいくつかあります。インスタンスごとにIDを作成する必要があります。通常、これを行うには、静的なlongを含む親クラスを作成し、サブクラスのインスタンスごとにIDをインクリメントします。

サブタイプのコードの75%は同じです-これにより、次のように(インターフェイスを介して)抽象クラスを使用することを好みました。

1)ID作成者の静的変数を宣言できます

2)コードを親クラスに入れて、サブタイプ間で共有できます

これは正しいです?私はめったにインターフェースを使わないようです。サブタイプが同じメソッドを必要とするが、実装が異なる場合、およびサブタイプ間で共有される属性を初期化する必要がない場合(ID作成者など)にのみインターフェイスを使用する必要がありますか?

私はいつも同僚から、継承よりもインターフェースが好まれるという印象を与えられていました。

4

2 に答える 2

5

IDの生成が必要なクラスのグループが複数ある場合は、再利用が制限されるため、継承を使用することはお勧めしません。その場合、一意のID生成のサービスを提供する別の抽象化を構築してみませんか?キーを与えると、同じキーを使用するすべての呼び出しで一意のIDが与えられます。

public class IdGenerator 
{
  private IdGenerator() {} // no instantiation or subclassing
  private static final ConcurrentMap<String, AtomicLong> ids =
    new ConcurrentHashMap<String, AtomicLong>();

  public static long id(String key) {
    AtomicLong al = ids.get(key);
    if (al == null) {
      final AtomicLong newL = new AtomicLong(0);
      al = ids.putIfAbsent(key, newL);
      if (al == null) al = newL;
    }
    return al.getAndIncrement();
  }
}
于 2012-07-07T12:25:10.350 に答える
3

インターフェイスと抽象クラス は異なる目的を果たします。インターフェイスは通常、インターフェイスのユーザーがその使用方法を確認するためのコントラクトを指定するために使用されますが、抽象クラスはインターフェイスの部分的な実装である場合があります。

属性共有の質問に移りますが、インターフェイスで宣言された変数は静的であり、さらに重要なことに最終的なものです。インクリメントするIDが必要なため、そのIDを使用しても機能しません。そのため、現在のIDと働くことは公正なアプローチです。

于 2012-07-07T12:33:59.087 に答える