コンストラクターは 1 つの実装のみを返すことができますが、静的ファクトリ メソッドは任意の数の実装を返すことができ、多くの場合、参照されるクラスのサブクラスです。静的ファクトリ メソッドには名前が付けられるという利点もあるため、同じ引数に対して異なる動作を行うことができます。
たとえば、これらの 2 つのメソッドは、名前に基づいて異なる値を持つ EnumSet のサブクラス (列挙型の要素の数に基づいて) を返します (引数は同じですが)。
EnumSet<MemoryType> memoryTypes = EnumSet.noneOf(MemoryType.class);
EnumSet<MemoryType> memoryTypes2 = EnumSet.allOf(MemoryType.class);
ソースから
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);
}
小さな列挙セット用の実装と、大きな列挙型セット用の別の実装があることがわかります。