#java #properties
#java #свойства
Вопрос:
Я внес некоторые изменения в исходный код. Я все еще должен учитывать, если свойства не загружаются. Надеюсь, это сработает.
общедоступный класс AnalyzerDriver {
private List<Analyzer> analyzers = new ArrayList<Analyzer>();
private Map<String, Integer> tokenCounts;
private Properties properties;
public AnalyzerDriver() {
}
public static void main(String[] args) {
AnalyzerDriver analyzerDriver = new AnalyzerDriver();
analyzerDriver.loadProperties();
// these three lines are causing the error
analyzerDriver.analyzers.add(new SummaryReport(properties));
analyzerDriver.analyzers.add(new UniqueTokenAnalyzer(properties));
analyzerDriver.analyzers.add(new BigWordAnalyzer(properties));
}
public void loadProperties() {
properties = new Properties();
try {
properties.load(this.getClass().getResourceAsStream("config/analyzer.properties"));
} catch (IOException ioe) {
System.out.println("Can't load the properties file");
ioe.printStackTrace();
} catch (Exception e) {
System.out.println("Problem: " e);
e.printStackTrace();
}
}
}
public class SummaryReport implements Analyzer {
private int totalTokensCount;
private Properties properties;
public SummaryReport() {
}
public SummaryReport(Properties properties) {
this.properties = properties;
}
}
// изменения
public static void main(строка [] аргументы) {
AnalyzerDriver analyzerDriver = new AnalyzerDriver();
analyzerDriver.loadProperties();
analyzerDriver.addAnalyzer();
}
public void addAnalyzer() {
analyzers.add(new SummaryReport(properties));
analyzers.add(new UniqueTokenAnalyzer(properties));
analyzers.add(new BigWordAnalyzer(properties));
}
public void loadProperties() {
properties = new Properties();
try {
properties.load(this.getClass().getResourceAsStream("config/analyzer.properties"));
}
catch(IOException ioe) {
System.out.println("Can't load the properties file");
ioe.printStackTrace();
}
catch(Exception e) {
System.out.println("Problem: " e);
e.printStackTrace();
}
}
}
Комментарии:
1. обратите внимание, что распечатка точной ошибки, которую вы получаете, ускорит скорость, с которой будет дан ответ на ваш вопрос 🙂
Ответ №1:
Ваш main
метод ссылается непосредственно на свойство экземпляра properties
Одним из решений было бы, чтобы properties
переменная была локальной main
и передавалась непосредственно в Analyzer
реализации. Если он больше нигде не используется AnalyzerDriver
, просто верните свойства из loadProperties
и сохраните в локальном.
Вам нужно будет решить, что делать, если свойства не загружаются (чего вы сейчас не делаете).
... main(...) {
Properties properties = loadProperties();
analyzerDriver.analyzers.add(new SummaryReport(properties));
....
Редактировать Я удалил решение, на которое ссылается Усман, имея средство получения для возврата экземпляра properties
… свойство.
analyzerDriver.analyzers.add(new SummaryReport(analyzerDriver.getProperties()));
Комментарии:
1. @jeff Другими словами, вызов метода должен быть analyzerDriver.analyzers.add(новый сводный отчет(analyzerDriver.properties)); или лучше analyzerDriver.analyzers.add(новый сводный отчет(analyzerDriver.GetProperties()));
2. @UsmanSaleem Я отредактировал это решение из-под вас 😉 Но да, геттер был бы другим вариантом. В этом случае, вероятно, достаточно использовать локальный, но вы правы, я должен был оставить это решение!
Ответ №2:
У вас есть пара проблем.
main()
является статическим методом; он не может получить доступ ни к каким нестатическим переменным AnalyzerDriver
класса. properties
является частной переменной экземпляра.
После этого вы пытаетесь получить доступ к частной переменной экземпляра ( analyzers
) извне instance ( analyzerDriver
), чтобы добавить свои драйверы.
Вероятно, вы хотите создать общедоступный метод analyzerDriver
для добавления Analyzer
экземпляров.
public void addAnalyzer(Analyzer a)
{
analyzers.add(a);
}
Но это все еще оставляет проблему ваших свойств. Это действительно зависит от вашего дизайна и того, что вы делаете, но я бы, вероятно, внедрил AnalyzerFactory (фабричный шаблон), который загружал свойства, а затем создавал для вас экземпляры ваших объектов анализатора:
AnalyzerFactory factory = new AnaylyzerFactory();
Analyzer a = factory.get("SummaryReport");
analyzerDriver.addAnalyzer(a);