Я делаю мини-ORM для Java-программы, которую я пишу... для каждой таблицы в моем db есть класс, все наследуемые от ModelBase
.
ModelBase
является абстрактным и предоставляет кучу статических методов для поиска и привязки объектов из db, например:
public static ArrayList findAll(Class cast_to_class) {
//build the sql query & execute it
}
Итак, вы можете делать такие вещи, как ModelBase.findAll(Albums.class)
, чтобы получить список всех сохраненных альбомов.
Моя проблема заключается в том, что в этом статическом контексте мне нужно получить соответствующую строку sql из конкретного класса Album. У меня не может быть статический метод, например
public class Album extends ModelBase {
public static String getSelectSQL() { return "select * from albums.....";}
}
потому что для статических методов в Java не существует полиморфизма. Но я не хочу делать getSelectSQL()
метод экземпляра в Album
, потому что тогда мне нужно создать экземпляр его, чтобы получить строку, которая действительно статична в поведении.
В настоящий момент findAll()
использует отражение, чтобы получить соответствующий sql для рассматриваемого класса:
select_sql = (String)cast_to_class.getDeclaredMethod("getSelectSql", new Class[]{} ).invoke(null, null);
Но это довольно грубо.
Итак, какие-нибудь идеи? Это общая проблема, с которой я снова и снова сталкиваюсь - невозможность указать абстрактные статические методы в классах или интерфейсах. Я знаю, почему полиморфизм статического метода не работает и не может работать, но это не мешает мне снова использовать его снова!
Есть ли какой-либо шаблон/конструкция, которая позволяет мне гарантировать, что конкретные подклассы X и Y реализуют метод класса (или, если это не так, константа класса!)?