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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск методов из стринга, В стринге передаются методы для запуска 
V
    Опции темы
inohodec
Дата 27.7.2008, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет smile

Возник вопрос, есть сложная и запутанная конструкция классов и вызов нужного метода может приобретать ужасающие формы, например:
Код

Test.getObject1.getMethod2().getObject3.getMethod4().getMethod5()..... 

Где то так smile

В принципе каждый из объектов может быть null

Можно конечно сделать проверку с  ифами, но довольно громоздко 

И вот возникла идея написать метод который будет получать 2 параметра:
Первый - начало, в моем примерчикe это Test, т.е. живой объект который и нужно проверить
Второй - String -  путь к нужному объекту или методу - Test.getObject1.getMethod2().getObject3.getMethod4().getMethod5().....
Ну и дальше уже внутри метода акким то образом smile
Разложить стринг на составляющие, проверить нет ли по дороге null и если все ОК, вернуть true

И отсюда вопрос smile
Насколько это реально ?
Может есть другое решение?
И если все таки это осуществимо, то хотелось бы узнать как я могу из строки дергать нужные методы и проверять их ...

Всем спасибо smile
PM MAIL   Вверх
niasilil
Дата 27.7.2008, 08:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 9



а зачем парсить то? в этом методе зовешь функцию - если NullPointerException вываливается, то возвращай false. 


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
inohodec
Дата 27.7.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



niasilil

Это да, но это опять же решение через if
Количество подобных вызовов громадно ...

Мне придется делать какой нибудь switch
В нем уже вызывать эти методы и возвращать true/false
PM MAIL   Вверх
Platon
Дата 27.7.2008, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(inohodec @  27.7.2008,  10:02 Найти цитируемый пост)
Это да, но это опять же решение через if

Товарищ, вам религия не позволяет пользоваться if? Во-вторых niasilil предложил вариант где нет ниодного if

Добавлено через 1 минуту
niasilil, от меня лично спасибо, я что-то запамятовал, что так изящно можно решить такие проблемы ^_^
PM MAIL ICQ   Вверх
inohodec
Дата 27.7.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Религия позволяет ...

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

Есть класс Test и в нем еще 8!!! на сегодня smile
8 в смысле как матрешка

Начинаем иф
Код

if(Test != null)
{
   if(Test.get1() != null)
   {
       if(Test.get1().get2() != null)
       {
           if(Test.get1().get2().get3() != null)
           {
               if(Test.get1().get2().get3().get4() != null)
               {
                   if(Test.get1().get2().get3().get4().get5() != null)
                   {
                       if(Test.get1().get2().get3().get4().get5().get6() != null)
                       {
                           if(Test.get1().get2().get3().get4().get5().get6().get7() != null)
                           {
                               if(Test.get1().get2().get3().get4().get5().get6().get7().get8() != null)
                               {
                                   
                               }
                           }
                       }
                   }
               }
           }
       }
   }
}


Уже как то не фонтан smile
А ведь мне может понадобится дойти только то 4-ого или до 2-ого
Ну это решаемо допустим еще одним параметром  - deep

Но я расписал только один из путей 
А так каждый get может содержать несколько методов ...
Т.е. 

Test.get1().get2() не обязательно идет в get3
Он может вызвать еще другие ...
PM MAIL   Вверх
Platon
Дата 27.7.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Смотрим:

Код

public Object getObject(Test t) {
    try {
        return t.get1().get2().get3().get4().get5().get6().get7().get8();
    } catch (NullPointerException e) {
        return null;
    }
}

niasilil, просто герой!
PM MAIL ICQ   Вверх
inohodec
Дата 27.7.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



100% герой и огромное ему за это спасибо smile

Но я по прежнему с вопросом

Ок, использую я ваш подход, учитывая довольно большое разнообразие вызовов
Я должен делать switch, передавать ему какую то константу и запусакть соответствующий метод
Т.е. создать switch  на ... 100 smile полей 

Да, без ифов smile
Но по прежнему решение которое в дальнейшем будет требовать изменений
Добавятся классы, нужно будет добавлять что то в switch
Изменятся, изменять

Хотелось просто найти решение которое бы в дальнейшем в независимости от изменений ода оставалось постоянным
PM MAIL   Вверх
dorogoyIV
Дата 27.7.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



так вам надо познакомиться с методом рефлексии!
ну и плюс класс java.lang.Class с методами getMethods(), ...
PM MAIL   Вверх
Platon
Дата 27.7.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(inohodec @  27.7.2008,  10:46 Найти цитируемый пост)
Т.е. создать switch  на ... 100 smile полей 

Ты уверен что свич тебе нужен?
Можно предложить OO решение, расширяемое и гибкое.

Код

Map<Key, Task> map = new HashMap<Key, Task>();

public void doIt(Key key) {
    Task t = map.get(key);
    if (t != null) 
        t.run();
}


Если в doIt передаются параметры, то передавай из также в Task
Код

public void doIt(Key key, Val1 val1, Val2 val2) {
    Task t = map.get(key);
    if (t != null) 
        t.run(val1, val2);
}

PM MAIL ICQ   Вверх
inohodec
Дата 27.7.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Рефлексия ... и ОО 

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

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

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


 




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


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

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