Абстрактный статический фабричный метод [getInstance ()] в Java?

Конечно, в Java не работает следующее (без абстрактных статических методов) ...

public abstract class Animal {
    public abstract static Animal getInstance(byte[] b);
}

public class Dog extends Animal {
    @Override
    public static Dog getInstance(byte[] b) {
        // Woof.
        return new Dog(...);
    }
}

public class Cat extends Animal {
    @Override
    public static Cat getInstance(byte[] b) {
        // Meow.
        return new Cat(...);
    }
}

Какой правильный способ потребовать, чтобы Animal классы имели статический getInstance метод, который сам создает экземпляр? Этот метод должен быть статическим; «нормальный» абстрактный метод здесь не имеет смысла.


person Haywood Jablomey    schedule 16.07.2010    source источник
comment
По теме: stackoverflow.com/questions/129267/ и stackoverflow.com/questions/708336/   -  person finnw    schedule 17.07.2010


Ответы (1)


Невозможно указать в абстрактном классе (или интерфейсе), что реализующий класс должен иметь конкретный статический метод.

Подобный эффект можно получить, используя отражение.

Одна альтернатива - определить интерфейс AnimalFactory отдельно от класса Animal:

public interface AnimalFactory {
    Animal getInstance(byte[] b);
}

public class DogFactory implements AnimalFactory {
    public Dog getInstance(byte[] b) {
        return new Dog(...);
    }
}

public interface Animal {
    // ...
}

class Dog implements Animal {
    // ...
}
person finnw    schedule 16.07.2010
comment
Просто нет никакого смысла запрашивать новый экземпляр у существующего, потому что вы не можете получить его, если экземпляров еще нет. Здесь на помощь приходит классический статический фабричный метод (я понимаю, что сложно добиться хорошего дизайна, потому что вы не можете предоставить статический интерфейс или абстрактные методы). - person gyorgyabraham; 12.09.2012