3

Android 向けの開発中に、Bitmapクラスに出会いました。このクラスにパブリック コンストラクターがなく、代わりcreateBitmapにまったく同じ目的の静的関数を提供するのは奇妙だと思います。

構文的に利点はありません:

Bitmap bm = new Bitmap(10, 10);
Bitmap bm = Bitmap.createBitmap(10, 10);

他のクラスもこれを行うのを見てきました.同等の静的関数は通常newInstance. これの理由は何ですか?

4

4 に答える 4

6

あなたが説明しているものは、ファクトリメソッドと呼ばれます。これが存在するのは、特定のインターフェイスに準拠しているが、基になる実装が異なる可能性があるオブジェクトを取得する機能を提供するためです。

(完全に恣意的で些細な) 例として、Factory メソッドは ArrayList オブジェクトの代わりに LinkedList オブジェクトを渡すことを選択する場合があります。これは、指定した初期サイズが LinkedList でパフォーマンス上の利点をもたらす可能性があるためです。

ただし、どちらのリストの実装も IList インターフェイスに準拠しているため、結果のオブジェクトは IList として返されます。

于 2013-08-01T18:14:51.730 に答える
1

最初のケースでは、特定の型をインスタンス化する必要があります。2 番目では、返す型を決定するのは実装者に任せます。

私は Bitmap に詳しくありませんが、別の例として EnumSet があります。電話すると:

EnumSet<SomeEnum> set = EnumSet.noneOf(SomeEnum.class);

静的ファクトリ メソッドは、すべての状況で可能な限り効率的になるように、列挙型のアイテムの数に応じて異なる実装を使用します。

基になるコードは、RegularEnumSet小さな列挙型の場合またはJumboEnumSet大きな列挙型の場合のいずれかを返します。この種のコンテキスト最適化は、コンストラクターでは不可能です。

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
    Enum[] universe = getUniverse(elementType);
    if (universe == null)
        throw new ClassCastException(elementType + " not an enum");

    if (universe.length <= 64)
        return new RegularEnumSet<>(elementType, universe);
    else
        return new JumboEnumSet<>(elementType, universe);
}
于 2013-08-01T18:16:30.717 に答える