Абстрактный статический метод фабрики [getInstance ()] в Java? - PullRequest
3 голосов
/ 16 июля 2010

Конечно, следующее не работает в 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, который создает себя? Этот метод должен быть статическим; «нормальный» абстрактный метод здесь не имеет смысла.

1 Ответ

6 голосов
/ 16 июля 2010

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

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

Одной из альтернатив является определение интерфейса 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 {
    // ...
}
...