3

Comparator私は、インターフェースを扱う階層の実装に取り​​組んでいComparableます。私にはわからないことがいくつかあります。

  1. コンパレータチェーンにコンパレータを追加する場合、このコードは正確に何を意味しますか

    chain.addComparator(new sortByTitle());

    引数はコンパレータでなければならないことは知っていsortByTitle()ますが、このような関数をどのように実装するのかわかりませんか?コンパレータでは、2つの引数を取り、一方を他方と比較する関数を実装する必要があります。それから、compare(obj1, obj2)引数のない単一の(コンストラクタのように見える)呼び出しにどのように到達しますか?

  2. Databaseと呼ばれるにいくつかのアイテムを格納するArrayListというクラスを実装したとしitemます。変数item自体はプライベート変数です。これでメインプログラムで、次のような呼び出しが行われます。

    Collections.sort(library.item, chain);

    オブジェクトライブラリのインスタンスに直接アクセスするにはどうすればよいitemですか?itemデータベースの仕様では、プライベートである必要があると述べていますが、これは機能しますか?

助けていただければ幸いです。

4

1 に答える 1

4
  • ご存知かもしれませんが、Comparatorそれ自体がインターフェースです。あなたが言うときchain.addComparator(new sortByTitle());、あなたはあなたのオブジェクトをタイトルでソートするコンパレータの実装のインスタンスを渡しているのです。このsortByTitle場合、クラスは Comparator実装し、メソッドの実装を提供します compare(obj1, obj2)。チェーンは、渡すインスタンスで呼び出すことができます。通常、毎回新しいインスタンスを渡す代わりに、オブジェクトのすべてのComparator実装は、オブジェクト自体のパブリック静的最終メンバーとして宣言されます。

例えば:

public static final Comparator TITLE_COMPARATOR = new Comparator() {
    @Override
    public int compare(Object lhs, Object rhs) {
        // comparison logic
    }
};

次に、次の方法でそれらをチェーンに渡すことができます。

chain.addComparator(YourObject.TITLE_COMPARATOR);

これには、コンパレータ(ステートレス)を毎回新しいインスタンスを作成せずに他の場所で使用できるという追加の利点があります。

  • Libraryクラスにgetterとsetter(必要に応じてアクセサーとミューテーター)を記述する必要があります。これにより、privateとして宣言されている場合でも、他のクラスがitem変数を読み取ったり更新したりできるようになります。

何かのようなもの:

public List getItem() {
    return item;
}

public void setItem(List item) {
    this.item = item;
}

Libraryクラスで。

于 2012-06-23T22:44:23.977 に答える