Java méthode générique
J'ai tout un tas de classes qui définissent ces deux constantes, par exemple:
public class Face
{
public static final int LUMP_INDEX = 1;
public static final int SIZE = 20;
blah blah
}
public class Edge
{
public static final int LUMP_INDEX = 5;
public static final int SIZE = 32;
blah blah
}
etc.
À l'instant, j'ai une fonction pour chacun de créer un tableau de cette classe, à l'aide de l'2 constantes définies dans la classe.
private Face[] createFaces(RandomAccessFile in)
{
int numFaces = doSomeCalculations(Face.LUMP_INDEX, Face.SIZE);
Face[] faces = new Face[numPlanes];
blahblah;
for(int i = 0; i < numFaces; i++)
faces[i] = new Face();
return faces;
}
Un peu ridicule d'avoir créer une fonction pour chaque classe. La seule chose qui change est le type de classe. J'ai donc voulu créer un genertic méthode de travail avec l'une des classes ci-dessus. Quelque chose comme:
private T[] create(RandomAccessFile in, Class T)
{
int num = doSomeCalculations(T.LUMP_INDEX, T.SIZE);
T[] faces = new T[numPlanes];
blahblah;
for(int i = 0; i < num; i++)
faces[i] = new T();
return faces;
}
Cependant, je ne suis pas sûr de savoir comment le faire correctement. Toute aide serait appréciée. Merci.
- Comme Borgwardt dit, même si au lieu de champs de lecture, de réflexion, vous pouvez définir une interface avec deux
get
méthodes. - mais alors, vous auriez besoin d'une instance de la classe pour appeler les méthodes, puisqu'ils ne peuvent pas être statique et une partie de la Classe de l'objet.
- exactement, je voulais dire comme une étape possible de refactoriser le code. Peut-être par la création d'une nouvelle
T
d'abord, puis à l'aide det.setNumPlaces(n)
. Ou de stocker la configuration ailleurs, par exemple,UtilClass.getLumpIndex(Faces.class)
.
Vous devez vous connecter pour publier un commentaire.
Le seul moyen qui pourrait être fait pour travailler, c'est par l'aide de la réflexion à lire les constantes à travers la classe de l'objet et
Array.newInstance()
pour créer le tableau. Oh, et la signature de la méthode devra ressembler à ceci:Modifier
Une solution alternative serait de garder les constantes dans une carte assortie, par classe plutôt que comme des champs statiques. Java n'est tout simplement pas assez dynamique, en particulier sur le niveau de la classe, à faire les choses à votre manière proprement.
Il n'y a aucune excuse pour l'utilisation de la réflexion dans ce genre de situation. Bonde dans un Résumé de l'Usine ou similaire.
Potentiellement vous pouvez faire cela en ayant à la fois (tous?) les articles que vous souhaitez créer étendre certains super-classe "de la Matrice de Mesure de l'Objet"
Mais à la condition que votre "blablabla" en createFaces n'est pas le même, vous ne gagnez rien et vous-même dans un coin avec l'extension.
J'aurais l'air si ou non vous avez vraiment besoin de ces différentes classes qui tous la même chose, ou si il y a un peu plus grand miracle que vous pourriez regarder en. Si la seule différence entre les deux est leur variables statiques, par exemple - alors vous devez les transférer dans un seul emplacement, par exemple un fichier de ressources.
Si tout ce que vous avez le même, cependant, sont ceux "créer un tableau" les articles de ce code, puis en séparant ou en quelque sorte la liaison entre eux semble inutile, au mieux.
Vous pouvez toujours utiliser la forme plus simple:
Et de l'utiliser comme
Il n'est ni en tant que professionnel à l'aide d'un résumé de l'usine, ni ridicule (et dangereux!) comme ayant la même fonction, encore et encore. Vous pouvez toujours faire l'erreur de l'appeler à l'aide
Mais c'est une erreur qu'il est facile à point.
T[] a = (T[]) Array.newInstance(clazz, size);
Depuis le cast (T[]) est dangereux, vous aurez besoin d'utiliser une annotation comme@SuppressWarnings("unchecked")
au-dessus de votre méthode