Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать getID для класса 
:(
    Опции темы
3,14
  Дата 20.12.2005, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Ситуация такая, есть базовый класс (Class1), у него есть ряд потомков (Class2 и Class3). У каждого из типов должна быть ф-ия getID к-ая бы возвращала ID связанный с классом (для каждого класса ID известен за ранее).
Хотелась бы чтоб эта ф-ия была статической, чтоб можно было вызвать Class1.getID(), но в этом случае вызов ф-ии getID:
Код

Class1 someVar = new Class2();
someVar.getID();

возвратит ID для класса Class1, а не Class2, что не хорошо.

Как лучше решить данную проблему?

PS: Class1 можно делать вообще абстрактным, или интерфейсом

Это сообщение отредактировал(а) 3,14 - 20.12.2005, 15:06


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
LSD
Дата 20.12.2005, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(3)
Хотелась бы чтоб эта ф-ия была статической, чтоб можно было вызвать Class1.getID(), но в этом случае вызов ф-ии getID:
<...>
возвратит ID для класса Class1, а не Class2, что не хорошо.

Полиморфизм возможен только для не статических функций. Твоя функция очень, сильно напоминает стандартную getClass(), пусть она возвращает некий статический ID определенный в самом классе.

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 20.12.2005, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



А если через someVar.getClass().getField().getInt() ?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
val
Дата 20.12.2005, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Замени тип Class1 соответствующим интерфейсом с функцией getID().


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
3,14
Дата 20.12.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Цитата(LSD @ 20.12.2005, 15:01)
А статической функцией это не реализовать, т.п. статическая функция не знает для какого объекта она была вызвана и значит не знает его реального класса. Кстати вызовы статических методов от переменных порождают предупреждения компилятора, т.к. это плохой тон.


Почему не работает через статические ф-ии я знаю, но не думаю что создавать обьект класса для того что получить ID класса это хороший тон.

Цитата(LSD @ 20.12.2005, 15:01)
пусть она возвращает некий статический ID определенный в самом классе.

Цитата(Lamer @ 20.12.2005, 15:04)
А если через someVar.getClass().getField().getInt()

Думал на этот счёт, но по-моему не очень хорошее решение, хотя надо будет попробовать
Думаю что проблемма возникнет с наследованием от классов Class2 и Class3

Добавлено @ 15:09
Цитата(val @ 20.12.2005, 15:06)
Замени тип Class1 соответствующим интерфейсом с функцией getID().


Тогда чтоб вызвать ф-ию getID нам нужно будет иметь объект класса, что ИМХО не хорошо

Это сообщение отредактировал(а) 3,14 - 20.12.2005, 15:14


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
pvo
Дата 20.12.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.10.2005
Где: Мск

Репутация: 2
Всего: 7



А почему бы не сделать мапу, в которой хранить пары - Class-ID?
А у нее сделать статичный метод getID( Class clazz )?

Это сообщение отредактировал(а) pvo - 20.12.2005, 15:20
PM MAIL ICQ   Вверх
LSD
Дата 20.12.2005, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(3)
Почему не работает через статические ф-ии я знаю, но не думаю что создавать обьект класса для того что получить ID класса это хороший тон.

Если у тебя есть класс, то что мешает тебе получить его ID? Создай некую статическую HashMap в которую положи Ключ-Класс(или имя класса)/Значение-ID. Тот пример который ты написал описывает другой случай, когда есть объект достыпный по базовой ссылке, но надо получить его реальный ID класса.

P.S. Господа не используйте рефлексию, это крайне ненадежно (никаких проверок во время компиляции) и очень медленно:
Код
public class ReflectTest
{
  public static void main(String[] args)
  {
    try
    {
      Variable variable = new Variable();
      long start, stop;

      start = System.currentTimeMillis();
      for(int i = 0; i < 100 * 1000; i++)
      {
        setViaReflection(variable, "var");
        stop = variable.var;
      }
      stop = System.currentTimeMillis();
      System.out.println("setViaReflection: " + (stop - start));

      variable.var = 0;

      start = System.currentTimeMillis();
      for(int i = 0; i < 100 * 1000 * 1000; i++)
      {
        setDirect(variable);
        stop = variable.var;
      }
      stop = System.currentTimeMillis();
      System.out.println("setDirect: " + (stop - start));
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
  }

  private static void setViaReflection(Object obj, String fieldName) throws Exception
  {
    Field field = obj.getClass().getField(fieldName);
    int i = field.getInt(obj);
    i++;
    field.setInt(obj, i);
  }

  private static void setDirect(Variable variable) throws Exception
  {
    variable.var++;
  }

  private static class Variable
  {
    public int var = 0;
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
3,14
Дата 20.12.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Цитата(pvo @ 20.12.2005, 15:19)
А почему бы не сделать мапу, в которой хранить пары - Class-ID?
А у нее сделать статичный метод getID( Class clazz )?

У Object-а getClass тоже не статический, так что вроде смысла не имеет smile


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
LSD
Дата 20.12.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



А конструкция Class1.class?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
3,14
Дата 20.12.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Цитата(LSD @ 20.12.2005, 15:38)
А конструкция Class1.class?

Не знал что так можно, тогда вар-т c HashMap подходит


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Гость_serge
Дата 21.12.2005, 13:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

class Class1 {
  public final int ID = 1;
  public int getId () { return ID; }
  public static int getId(Class1 obj) { 
    if (obj == null) return 0;
    return obj.getId();
  }
}
class Class2 extends Class1 {
  public final int ID = 2;
  public int getId () { return ID; }
}

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.