Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Abstract static factory method [getInstance()] in Java?

Of course, the following doesn't work in Java (no abstract static methods)...

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(...);
    }
}

What's the correct way of requiring that Animal classes have a static getInstance method that instantiates itself? This method should be static; a "normal" abstract method doesn't make sense here.

like image 625
Haywood Jablomey Avatar asked Sep 12 '26 12:09

Haywood Jablomey


1 Answers

There is no way to specify in an abstract class (or interface) that an implementing class must have a particular static method.

It is possible to get a similar effect using reflection.

One alternative is to define an AnimalFactory interface separate from the Animal class:

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 {
    // ...
}
like image 98
finnw Avatar answered Sep 14 '26 03:09

finnw