2011-07-18 5 views
2

J'ai une méthode qui doit créer un tableau d'objets d'un certain type. Voici une partie:Java - Passer une classe en paramètre

public void myMethod() { 
    for (int i = 0; i < something.length; i++) { 
     ViewerSorter sorter = new IdeaTableSorter(i); 
     ..... 
     ..... 
    } 
} 

Je veux que cette méthode fonctionne avec tous les types de ViewerSorter objets, pas seulement associée à IdeaTableSorter, mais depuis que je dois créer un tas de ces objets que je veux transmettre une référence à myMethod indiquant la classe à instancier.

Existe-t-il un moyen de le faire sans utiliser l'API Reflection?

+0

On dirait que vous avez besoin d'un modèle de stratégie –

+1

Pourquoi passer pas seulement dans un 'ViewSorter' objet? – skaffman

+0

skaffman - Parce que je ne cherche pas seulement à passer un objet, je cherche à passer le type de classe qu'un tableau d'objets devrait être créé comme – bcoughlan

Répondre

4

Vous pouvez passer un objet Factory qui instancie votre classe. Ce serait le Abstract factory pattern. Par exemple:

interface ViewSorterFactory { 
    ViewSorter create(); 
} 
class IdeaTableSorterFactory implements ViewSorterFactory { 
    ViewSorter create() { return new IdeaTableSorter(); } 
} 
class FooTableSorterFactory implements ViewSorterFactory { 
    ViewSorter create() { return new FooSorter(); } 
} 

Et puis:

myMethod(new IdeaTableSorterFactory()); 

où:

for (int i = 0; i < something.length; i++) { 
    ViewerSorter sorter = factory.create(); 

Class.newInstance() est pas exactement l'API de réflexion, mais je suppose que vous vouliez dire cette option comme indésirable. Mais lui donner un essai - cette approche est la même - vous passez une usine (dans ce cas Class) et appeler une méthode de création (.newInstance())

+0

+1, ceci est en fait la meilleure utilisation de l'usine –

1

Vous pouvez transmettre un objet avec une méthode qui crée des trieurs de visionneuses, un fournisseur de sortes.

public void myMethod(ViewerSorterProvider creator) { 
    for (int i = 0; i < something.length; i++) { 
     ViewerSorter sorter = creator.create(i); 
     ..... 
     ..... 
    } 
} 

public interface ViewerSorterProvider { 
    ViewerSorter create(int i); 
} 
1

Vous pouvez passer un factory object dans la méthode permettant de créer les types appropriés.

2

Oui, vous pouvez le faire en utilisant la réflexion. Cependant, il serait sans doute plus propre à utiliser le modèle d'usine:

public interface IViewerSorterFactory { 
    ViewerSorter create(int i); 
} 

public void myMethod(IViewerSorterFactory factory) { 
    for (int i = 0; i < something.length; i++) { 
     ViewerSorter sorter = factory.create(i); 
     ..... 
     ..... 
    } 
} 
Questions connexes