Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как узнать имя класса, статический метод которого вызван из родителя / 13 сообщений из 13, страница 1 из 1
26.12.2006, 21:30:27
    #34226357
Aqwerty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
Пожалуйста, подскажите как лучше решить такую проблему:
Есть класс Entity, у него есть наследники (например, Agreement). Каждому наследнику соответствует табличка в БД (в частном случае) или в другом хранилище.
У родителя есть статический метод Query, смысл которого - вернуть список объектов-детей, соответствующих указанному условию.
Т.е. хочется написать что-то вида:
AgreementList a = Agreement.Query(...);
Каждый элемент AgreementList - это должен быть объект класса Agreement.

Проблема в том, что метод Query должен быть статическим, чтобы перед каждым его использованием не создавать по сути ненужный объект Agreement. Но в этом случае из метода Query не получается определить имя класса (в примере - Agreement), по отношению к которому он вызван.

Какие решения существуют в данной ситуации?
...
Рейтинг: 0 / 0
26.12.2006, 21:50:23
    #34226380
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
Классиков надо читать! Хорстмана, например.
Код: plaintext
1.
2.
3.
        Throwable t =  new  Throwable();
        StackTraceElement[] st = t.getStackTrace();
        String className = st[ 0 ].getClassName();
...
Рейтинг: 0 / 0
26.12.2006, 21:55:37
    #34226386
Йогурт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
а зачем это надо?
это вообще-то неправильно
и, есть подозрение, что Agreement.equery() все равно будет преобразован компиллятором в Entity.query()
...
Рейтинг: 0 / 0
26.12.2006, 21:56:52
    #34226390
Йогурт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
ЗашедшийКлассиков надо читать! Хорстмана, например.
Код: plaintext
1.
2.
3.
        Throwable t =  new  Throwable();
        StackTraceElement[] st = t.getStackTrace();
        String className = st[ 0 ].getClassName();



что это даст?
...
Рейтинг: 0 / 0
26.12.2006, 22:05:01
    #34226396
Aqwerty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
йогурта зачем это надо?
это вообще-то неправильно
и, есть подозрение, что Agreement.equery() все равно будет преобразован компиллятором в Entity.query()
надо иметь возможность получить список объектов, соответствующих указанному условию. Можно, конечно, имя класса передавать явно в виде параметра (как строку), но Agreement.Query(...) выглядит гораздо удобнее, чем Query("имя_пакета.Agreement", ...)
И почему же Вы считаете, что это неправильно?
Иметь метод load у Agreement, который на самом деле наследуется от Entity и загружает данные в объект из БД правильно, а вот иметь аналогичный метод, но который возвращает список - неправильно.
Тут на самом деле проблема в том, что все работает, если метод Query не статический, но тогда приходится писать что-то вида:
Agreement q = new Agreement();
q.Query(...);

а вот Agreement q = new Agreement(); и не хочется писать каждый раз, когда нужно получить список объектов, да и зачем? просто потому, что больше никак имя класса не узнать из статического метода?
...
Рейтинг: 0 / 0
26.12.2006, 22:14:38
    #34226410
Йогурт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
неправильно, потому что статический метод принадлежит строго определенному классу, и наследование на такое положение вещей не влияет

вариант только написать аналогичный метод с такой же сигнатурой для всех потомков

хотя проблема все равно странная какая-то
...
Рейтинг: 0 / 0
26.12.2006, 22:31:11
    #34226426
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
йогуртнеправильно, потому что статический метод принадлежит строго определенному классу, и наследование на такое положение вещей не влияет

вариант только написать аналогичный метод с такой же сигнатурой для всех потомков

хотя проблема все равно странная какая-то
Согласен, сначала неправильно понял вопрос.
...
Рейтинг: 0 / 0
27.12.2006, 01:24:10
    #34226539
Aqwerty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
йогуртнеправильно, потому что статический метод принадлежит строго определенному классу, и наследование на такое положение вещей не влияет

вариант только написать аналогичный метод с такой же сигнатурой для всех потомков

хотя проблема все равно странная какая-то
в чем странность?
1. моделируем Java-объектами таблицы БД
2. код загрузки/сохранения данных в объект однотипный для всех классов, представляющих оьъекты БД, т.е. методы insert,update,delete,select одинаковые
3. хочу иметь метод, возвращающий список объектов по указанному условию, НО не хочу каждый раз создавать экземпляр класса только для того чтобы вызвать один метод. Точно также как никто не хочет перед вызовом, например, функции sin создавать экземпляр класса, в котором она определена.

Так что никакой странности не вижу. Если Вам понятна задача, то конкретно укажите в чем странность, может действительно надо посмотреть иначе и будет другое решение.
...
Рейтинг: 0 / 0
27.12.2006, 01:50:12
    #34226546
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
Насколько я понял, у вас есть подклассы, которые создаются по определенному условию (БД, это наверное все-таки частности). Не пробовали смотреть в сторону абстрактной фабрики? Правда, похоже, придется делать преобразование (Agreement) Agrement.Query().get(i).
А вообще, может вам Hibernate сможет помочь (или какая другая ORM)?
...
Рейтинг: 0 / 0
27.12.2006, 01:51:43
    #34226548
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
Описался.
Код: plaintext
1.
Agreement a = Entity.Query().get(i)
...
Рейтинг: 0 / 0
27.12.2006, 09:10:52
    #34226773
ахха
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
ЗашедшийКлассиков надо читать! Хорстмана, например.
Код: plaintext
1.
2.
3.
        Throwable t =  new  Throwable();
        StackTraceElement[] st = t.getStackTrace();
        String className = st[ 0 ].getClassName();

И чо - работает? Или все же throw надо делать?
...
Рейтинг: 0 / 0
27.12.2006, 09:37:23
    #34226831
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
see the followed DDD&ORM patterns: Repository, Query object, Data Mapper. Also review the Hibernate documentation
...
Рейтинг: 0 / 0
27.12.2006, 13:01:53
    #34227670
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать имя класса, статический метод которого вызван из родителя
ахха ЗашедшийКлассиков надо читать! Хорстмана, например.
Код: plaintext
1.
2.
3.
        Throwable t =  new  Throwable();
        StackTraceElement[] st = t.getStackTrace();
        String className = st[ 0 ].getClassName();

И чо - работает? Или все же throw надо делать?
Работает, возвращает имя класса, в котором метод реализован - но это не то, что надо. Не дочитал текст задачи :(
З.Ы. Никаких throw здесь делать не надо!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как узнать имя класса, статический метод которого вызван из родителя / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]