В качестве оговорки я прочитал Почему статические методы не могут быть абстрактными в Java и, даже если я уважительно не согласен с принятым ответом о «логическом противоречии», Я не хочу никакого ответа о полезности статической аннотации
, просто ответ на мой вопрос;)
У меня есть иерархия классов, представляющая некоторые таблицы из базы данных. Каждый класс наследует класс Entity
, который содержит множество служебных методов для доступа к базе данных, создания запросов, экранирования символов и т. Д.
Каждый экземпляр класса представляет собой строку из базы данных.
Теперь, чтобы факторизовать как можно больше кода, я хочу добавить информацию о связанных столбцах и имени таблицы для каждого класса. Эта информация должна быть доступна без экземпляра класса и будет использоваться в Entity
, среди прочего, для построения запросов.
Очевидным способом хранения этих данных являются статические поля, возвращаемые статическими методами в каждом классе. Проблема в том, что вы можете • заставить класс реализовать эти статические методы, и вы не можете выполнять динамическое связывание при вызове статических методов в Java.
HashMap
или любую аналогичную структуру данных для хранения информация. Проблема: если информация отсутствует, ошибка будет во время выполнения, а не во время компиляции. Как вы справитесь с отсутствием абстрактной статики
и динамической компоновки абстрактного метода?
В a perfect world, данное решение должно генерировать ошибку компиляции, если информация для класса отсутствует, а данные должны быть легко доступны из класса Entity.
Ответ не обязательно должен быть на Java, C # тоже подходит, и любое понимание того, как это сделать без определенного кода на любом языке, будет приветствоваться.
Для ясности, у меня нет никаких требований, кроме простоты. Ничего не должно быть статичным. Я хочу получить только имя таблицы и столбца из Entity
, чтобы построить запрос.
class Entity {
public static function afunction(Class clazz) { // this parameter is an option
// here I need to have access to table name of any children of Entity
}
}
class A extends Entity {
static String table = "a";
}
class B extends Entity {
static String table = "b";
}