Введение
Как отказ от ответственности, я прочитал Почему статические методы не могут быть абстрактными в Java и даже если я с уважением не согласен с принятым ответом о "логическом противоречие", я не хочу никакого ответа о полезности static abstract
просто ответа на мой вопрос;)
У меня есть иерархия классов, представляющая некоторые таблицы из базы данных. Каждый класс наследует класс Entity
, который содержит много полезных методов для доступа к базе данных, создания запросов, экранирования символов и т.д.
Каждый экземпляр класса представляет собой строку из базы данных.
Проблема
Теперь, чтобы разделить как можно больше кода, я хочу добавить информацию о связанных столбцах и имени таблицы для каждого класса. Эти сведения должны быть доступны без экземпляра класса и будут использоваться в Entity
для создания запросов между прочим.
Очевидным способом хранения этих данных являются статические поля, возвращаемые статическими методами в каждом классе. Проблема в том, что вы не можете заставить класс реализовать эти статические методы, и вы не можете выполнять динамическое связывание при вызове статических методов в Java.
Мои решения
- Используйте
HashMap
или любую подобную структуру данных для хранения информации. Проблема: если информация отсутствует, ошибка будет во время выполнения, а не время компиляции. - Используйте иерархию параллельного класса для функции утилиты, в которой каждый экземпляр каждого объекта может быть создан и используется динамическое связывание. Проблема: код тяжелый, ошибка выполнения, если класс не существует
Вопрос
Как вы справитесь с отсутствием abstract static
и динамической привязкой к абстрактному методу?
В идеальном мире данное решение должно генерировать ошибку компиляции, если информация для класса отсутствует, а данные должны быть легко доступны из класса Entity.
Ответ не обязательно должен быть в Java, С# тоже в порядке, и любое понимание того, как это сделать без какого-либо конкретного кода на любом языке, будет приветствоваться.
Просто, чтобы быть ясным, у меня нет никаких требований, кроме простоты. Ничто не должно быть статичным. Я хочу получить имя таблицы и столбцов из 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";
}