Je suis en train de créer un mini ORM pour un programme Java que j'écris... il y a une classe pour chaque table de ma base de données, toutes héritant de ModelBase
.
ModelBase
est abstrait et fournit un ensemble de méthodes statiques pour trouver et lier des objets de la base de données, par exemple :
public static ArrayList findAll(Class cast_to_class) {
//build the sql query & execute it
}
Vous pouvez donc faire des choses comme ModelBase.findAll(Albums.class)
pour obtenir une liste de tous les albums persistants. Mon problème est que dans ce contexte statique, je dois obtenir la chaîne sql appropriée de la classe concrète Album. Je ne peux pas avoir une méthode statique comme
public class Album extends ModelBase {
public static String getSelectSQL() { return "select * from albums.....";}
}
car il n'y a pas de polymorphisme pour les méthodes statiques en Java. Mais je ne veux pas faire getSelectSQL()
une méthode d'instance dans Album
parce que je dois alors créer une instance de celui-ci pour obtenir une chaîne dont le comportement est vraiment statique.
En ce moment, findAll()
utilise la réflexion pour obtenir le sql approprié pour la classe en question :
select_sql = (String)cast_to_class.getDeclaredMethod("getSelectSql", new Class[]{} ).invoke(null, null);
Mais c'est plutôt dégoûtant.
Alors, des idées ? C'est un problème général que je rencontre sans cesse : l'impossibilité de spécifier des méthodes statiques abstraites dans les classes ou les interfaces. Je sais que pourquoi Le polymorphisme des méthodes statiques ne fonctionne pas et ne peut pas fonctionner, mais cela ne m'empêche pas de vouloir l'utiliser à nouveau !
Existe-t-il un modèle/construction qui me permette de m'assurer que les sous-classes concrètes X et Y implémentent une méthode de classe (ou à défaut, une constante de classe !) ?