В моем приложении мне нужны данные, доступные для нескольких видов деятельности. Я прочитал, что хорошим решением является использование класса Application
для этого. Поэтому я использую его следующим образом:
public class MyApplication extends Application {
private String str;
public String getStr(){
return str;
}
public void setStr(String s){
str = s;
}
}
и я могу получить доступ к этой переменной из такой активности:
MyApplication appState = ((MyApplication)getApplicationContext());
String str = appState.getStr();
Это нормально, но у меня также есть класс парсера xml:
public class MyXMLHandler extends DefaultHandler {
и если я попытаюсь сделать то же самое здесь
MyApplication app = ((MyApplication)getApplicationContext());
String str = app.getStr();
Я получаю The method getApplicationContext() is undefined for the type MyXMLHandler
Как мне получить доступ к моей переменной?
Ну, обычно класс парсера XML должен быть независимым от какого-либо специального контекста. Это означает, что разработчик должен иметь возможность использовать его независимо от того, разрабатывает ли он приложение или службу или библиотеку или что бы то ни было.
Класс парсера XML не должен делать никаких предположений относительно контекста, в котором он используется и откуда он получает параметры (вы должны ограничивать ваш синтаксический анализатор, только если он имеет доступ к экземпляру Application
). Парсер не должен получать свои параметры, параметры должны быть заданы вызывающим.
Вы бы не хотели, чтобы ваш класс парсера XML отображал сообщения пользователю, не так ли? Правильно: "Что делает парсер XML с пользовательскими интерфейсами?" Вместо этого вы выбрали исключения и убедитесь, что они правильно обработаны, например, в зависимости от того, существует ли пользовательский интерфейс или нет (протоколирование).
Итак, что бы вы сделали, это передать необходимые параметры при создании экземпляра вашего синтаксического анализатора XML. Но вы не передаете экземпляр вашего приложения в качестве параметра (подумайте снова о зависимостях), но вы передаете необходимые параметры из вашего класса приложения.
В приведенном выше примере:
MyApplication app = ((MyApplication)getApplicationContext());
MyXmlHandler handler = new MyXmlHandler(app.getStr());
Вы должны действительно следить за тем, чтобы "материал инструмента" был отделен от всего, что помешало бы вам использовать его повсеместно. Что произойдет, если вы захотите использовать свой класс XML Parser в другом проекте, где ваш параметр не указан контекстом приложения, а какой-то другой класс?
Я уверен, что вы можете провести недельную дискуссию об объектно-ориентированном дизайне и о том, как все должно быть сделано, - но это в основном, как я это сделаю...
Thorsten прав, но если вы все еще решите использовать свое приложение, вы можете использовать Singleton.
public class MyApplication extends Application {
private static MyApplication instance;
public static MyApplication getInstance() {
if(instance == null){
instance = new MyApplication();
}
return instance;
}
}