[?]Компактный код при использовании Method(Java)

Купить VPN
Профессиональная разработка сайта
Форум о закупках [+]
Печать / RSS
4


Оранжевые штаны
0
Всем привет! Думаю тут есть джава программисты, сам я пока что в терминах да и в коде не силен..
У системного класса 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;
}
Вот такое чудо, собственно не гламурно не кошерно выглядит такой код, а без кэтчей приложение попросту не запускается.
Есть решение как использовать динамический вызов метода избегая такой каши в коде?
Изменил: Антон (04.10.2014 / 08:11)

Оранжевые штаны
0
Переносить throws в семанитку метода не пробовал?

Оранжевые штаны
0
2. Башка, пробовал, после этого в месте вызова метода GetCountry приходится прописывать эти кэтчи, а это еще больше каша чем в исходном варианте.

Оранжевые штаны
0
3. WmLiM, и это нормально. catch не должен быть пустым. Либо ты обрабатываешь ошибку, либо выбрасываешь ее выше, о чем сообщаешь в семантике функции.

Оранжевые штаны
0
4. Башка, да это понятно что должно заполняться, просто раньше я мог их указать, а мог проигнорить, к примеру http менеджер, он не требует отлова ошибок, можно написать это, а можно проигнорить. Конечно при таком раскладе любая ошибка вызовет крах приложения, но я то знаю что код валидный и хотелось бы самому решать, когда нужны мне catch, а когда нет.

Оранжевые штаны
0
5. WmLiM, не любая ошибка, а любая критическая ошибка, и не крах приложения, а выброс исключения по стеку вызовов. Это разные вещи. Напиши обработчик исключений на вершите стека вызовов и выноси throws в семантику методов. Это правильно и кошерно.

Оранжевые штаны
0
6. Башка, ну да, тебе легко сказать)) Я попробую сейчас универсальный класс сварганить, для вызова методов.

Оранжевые штаны
0
Вот такой не большой класс получился, только сильно не пинай Башка, я самоучка, мне не так важны термины как рабочий код.
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"));
Изменил: Антон (05.10.2014 / 11:43)

Оранжевые штаны
0
Напишешь большой проект, поймешь зачем нужны throws в семантике методов. Пока делай как хочешь.

Оранжевые штаны
0
9. Башка, если я тебя правильно понял то throws нужен в том случае когда хочешь обработать определенное событие при каждом вызове.

Добавлено через 02:26 сек.
Да и смысл мне писать большой проект если у меня не хватит знаний его закончить. Я писал не большие библиотеки на сервер, но не более.
Для выполнения действия необходимо авторизоваться!
Стикеры / Теги / Правила / Топ тем / Топ тем / Поиск