[?]Компактный код при использовании Method(Java)
1.
Антон (04.10.2014 / 08:09)
Всем привет! Думаю тут есть джава программисты, сам я пока что в терминах да и в коде не силен..
У системного класса TelephonyManager есть метод getSimCountryIso(), так вот обычно инициализация менеджера и вызов метода занимает всего две строчки
public String getCountry() {
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
return tm.getSimCountryIso();
}
Но когда я пытаюсь вызвать метод динамически у меня получается очень большой код, в основном там одни кэтчи
public String getCountry(Context context) {
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
String country = "";
try {
Method getSimCountryIso = tm.getClass().getMethod("getSimCountryIso");
country = (String) getSimCountryIso.invoke(context);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
return country;
}
Вот такое чудо, собственно не гламурно не кошерно выглядит такой код, а без кэтчей приложение попросту не запускается.
Есть решение как использовать динамический вызов метода избегая такой каши в коде?
2.
Артур (04.10.2014 / 11:43)
Переносить throws в семанитку метода не пробовал?
3.
Антон (04.10.2014 / 12:07)
2.
Башка, пробовал, после этого в месте вызова метода GetCountry приходится прописывать эти кэтчи, а это еще больше каша чем в исходном варианте.
4.
Артур (04.10.2014 / 17:03)
3.
WmLiM, и это нормально. catch не должен быть пустым. Либо ты обрабатываешь ошибку, либо выбрасываешь ее выше, о чем сообщаешь в семантике функции.
5.
Антон (05.10.2014 / 03:03)
4.
Башка, да это понятно что должно заполняться, просто раньше я мог их указать, а мог проигнорить, к примеру http менеджер, он не требует отлова ошибок, можно написать это, а можно проигнорить. Конечно при таком раскладе любая ошибка вызовет крах приложения, но я то знаю что код валидный и хотелось бы самому решать, когда нужны мне catch, а когда нет.
6.
Артур (05.10.2014 / 10:37)
5.
WmLiM, не любая ошибка, а любая критическая ошибка, и не крах приложения, а выброс исключения по стеку вызовов. Это разные вещи. Напиши обработчик исключений на вершите стека вызовов и выноси throws в семантику методов. Это правильно и кошерно.
7.
Антон (05.10.2014 / 11:06)
6.
Башка, ну да, тебе легко сказать)) Я попробую сейчас универсальный класс сварганить, для вызова методов.
8.
Антон (05.10.2014 / 11:41)
Вот такой не большой класс получился, только сильно не пинай Башка, я самоучка, мне не так важны термины как рабочий код.
public class Methods {
private Object methodsObject;
private Class<?>[] parametersType;
public Methods(Object object, Class<?>... parametersType) {
this.methodsObject = object;
this.parametersType = parametersType;
}
public Object methodCall(String requiredMethod, Object... args) {
Object result = null;
try {
Method method = methodsObject.getClass().getMethod(requiredMethod,
parametersType);
result = method.invoke(methodsObject, args);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return result;
}
}
Сейчас еще допишу под системные методы и сервисы напишу.
По поводу класса, на мой взгляд это самый простой способ выполнить какой либо метод динамически.
Пример использования метода
TextView text = (TextView) this.findViewById(R.id.textView1);
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Methods methods = new Methods(tm);
text.setText((String) methods.methodCall("getSimCountryIso"));
9.
Артур (05.10.2014 / 13:09)
Напишешь большой проект, поймешь зачем нужны throws в семантике методов. Пока делай как хочешь.
10.
Антон (05.10.2014 / 14:17)
9.
Башка, если я тебя правильно понял то throws нужен в том случае когда хочешь обработать определенное событие при каждом вызове.
Добавлено через 02:26 сек.
Да и смысл мне писать большой проект если у меня не хватит знаний его закончить. Я писал не большие библиотеки на сервер, но не более.
11.
Артур (05.10.2014 / 21:04)
10.
WmLiM, на вот
http://visavi.net/blog/blog.php?act=view&id=429 прочитай про исключения для начала.
12.
Антон (06.10.2014 / 00:37)
11.
Башка, не убедил, си не первый язык программирования на котором я что то писал ))
К чему ты клонишь советуя прочитать статью? Мне интересно, возможно ли написать код более компактнее чем тот что я предоставил, мне нужно прочитать статью чтобы мне ответили на вопрос?
13.
Артур (06.10.2014 / 11:39)
12.
WmLiM, как хочешь. Мне то все равно.
14.
Антон (06.10.2014 / 13:57)
13.
Башка, именно такой ответ я и ожидал здесь получить.
Визави как обычно в своём духе, пустая трата времени))
URL:
https://visavi.net/topics/41387