Как выяснить, какой класс называется статическим методом? - PullRequest
2 голосов
/ 25 января 2011

У меня есть класс:

class Superclass { static List list() { ... } }

и подклассы:

class Subclass extends Superclass { ... }
class Subclass2 extends Superclass { ... }

Я хочу вызвать метод list следующим образом: Subclass.list() или Subclass2.list(), исделать что-то другое в зависимости от того, с каким подклассом он был вызван.

Есть ли способ узнать, какой подкласс вызывает метод list?

Примечание: я не хочу иметьпереопределить метод list в каждом из подклассов.

ОБНОВЛЕНИЕ: Все говорят, что это плохой дизайн, и в большинстве случаев я думаю, что это будет, но я так не думаю в моем случае.Мой ORM определяет методы, которые принимают java.lang.Class.Я хочу предоставить сокращение для методов ORM, чтобы я мог сказать User.list(...) вместо ORM.list(User.class, ...).

Ответы [ 5 ]

1 голос
/ 25 января 2011

Я согласен, что это не самый лучший дизайн.Если у вас есть веские причины для этого, вот решение:

Следующий фрагмент должен напечатать

SuperClass.list () - вызывается Subclass или же SuperClass.list () - вызывается Subclass2

...
    static List list() { 
      System.out.println("SuperClass.list() - called by "+Thread.currentThread().getStackTrace()[3].getClassName());
//[3] because you want to skip these last three calls to get to this information -:)
     }
...
1 голос
/ 25 января 2011

Вы имеете в виду, что подкласс будет вызывать метод?Тогда это должен быть метод экземпляра (не статический), абстрактный, и подкласс обеспечит реализацию.

Или вы имеете в виду переопределение статического метода?Это невозможно, по крайней мере, не в значимой форме.Вы можете попытаться скрыть статический метод суперкласса, определив его в подклассе, но это не настоящее отношение наследования.

1 голос
/ 25 января 2011

Похоже на проблему Интерфейса / Реализации.

Создайте интерфейс для метода list () и затем напишите две реализации, Подкласс использует реализацию1, Подкласс2 использует реализацию 2.

ОБНОВЛЕНИЕ

Посмотрите на мой комментарий, проверьте этот вопрос Как найти вызывающего метода, использующего stacktrace или отражение?

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

0 голосов
/ 25 января 2011

Относительно того, кто знает, кто его вызвал: это ничем не отличается от определения класса вызова в целом.Традиционно это было сделано путем генерирования исключения, его перехвата и проверки трассировки стека.Но позже в JDK есть методы для доступа к трассировке стека, не вызывая исключения (Thread.getStackTrace (), доступно с версии 1.5).

0 голосов
/ 25 января 2011

Вы можете заставить метод списка принимать аргумент, вызывать метод наподобие

Subclass.list(type)

и затем проверять тип.Своего рода грязная мысль.Возможно, вы захотите рассмотреть другой вариант дизайна.Возможно, было бы лучше создать методы

listForSubclass1 

или

listForSubclass2

, но даже тогда это кажется неправильным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...