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

Печать RSS
328

Автор
Оранжевые штаны
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 сек.
Да и смысл мне писать большой проект если у меня не хватит знаний его закончить. Я писал не большие библиотеки на сервер, но не более.
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск