Имитация статической абстрактной и динамической компоновки при вызове статического метода в Java

Введение

В качестве оговорки я прочитал Почему статические методы не могут быть абстрактными в Java и, даже если я уважительно не согласен с принятым ответом о «логическом противоречии», Я не хочу никакого ответа о полезности статической аннотации , просто ответ на мой вопрос;)

У меня есть иерархия классов, представляющая некоторые таблицы из базы данных. Каждый класс наследует класс Entity , который содержит множество служебных методов для доступа к базе данных, создания запросов, экранирования символов и т. Д.

Каждый экземпляр класса представляет собой строку из базы данных.

Проблема

Теперь, чтобы факторизовать как можно больше кода, я хочу добавить информацию о связанных столбцах и имени таблицы для каждого класса. Эта информация должна быть доступна без экземпляра класса и будет использоваться в Entity , среди прочего, для построения запросов.

Очевидным способом хранения этих данных являются статические поля, возвращаемые статическими методами в каждом классе. Проблема в том, что вы можете • заставить класс реализовать эти статические методы, и вы не можете выполнять динамическое связывание при вызове статических методов в Java.

Мои решения

  1. Используйте HashMap или любую аналогичную структуру данных для хранения информация. Проблема: если информация отсутствует, ошибка будет во время выполнения, а не во время компиляции.
  2. Используйте параллельную иерархию классов для служебной функции, где каждый соответствующий класс может быть создан, и используется динамическое связывание. Проблема: тяжелый код, ошибка времени выполнения, если класс не существует

Вопрос

Как вы справитесь с отсутствием абстрактной статики и динамической компоновки абстрактного метода?

В 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";
}
23
задан Community 23 May 2017 в 11:33
поделиться