2010-07-16 7 views
3

Bien sûr, ce qui suit ne fonctionne pas en Java (pas de méthodes statiques abstraites) ...Méthode statique usine statique [getInstance()] dans 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(...); 
    } 
} 

Quelle est la bonne façon d'exiger que Animal classes ont une méthode getInstance statique qui s'instancie? Cette méthode devrait être statique; une méthode abstraite "normale" n'a pas de sens ici.

+0

connexes: http://stackoverflow.com/questions/129267/why-no-static-methods-in-interfaces- mais-static-fields-and-inner-classes-ok et http://stackoverflow.com/questions/708336/beginner-factory-pattern-in-java – finnw

Répondre

6

Il n'existe aucun moyen de spécifier dans une classe abstraite (ou une interface) qu'une classe d'implémentation doit avoir une méthode statique particulière.

Il est possible d'obtenir un effet similaire en utilisant la réflexion.

Une alternative consiste à définir une interface AnimalFactory séparée de la classe 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 { 
    // ... 
} 
+1

Cela n'a pas de sens de demander une nouvelle instance à partir d'une instance existante, car vous ne pouvez pas en obtenir une s'il n'y a encore aucune instance. C'est là qu'intervient la méthode d'usine statique classique (difficile d'obtenir une conception agréable, je comprends cela, parce que vous ne pouvez pas fournir une interface statique ou des méthodes abstraites). – gyorgyabraham

Questions connexes