[?]Компактный код при использовании 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