我对原始代码进行了一些更改。我仍然需要考虑是否没有加载属性。希望这会奏效。
公共类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(String [] args){
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();
}
}
}
答案 0 :(得分:2)
您的main
方法直接引用实例属性properties
一种解决方案是让properties
变量为main
的本地变量,并直接传递给Analyzer
实现。如果它未在AnalyzerDriver
中的任何其他地方使用,只需从loadProperties
返回属性并保存到本地。
如果属性无法加载(您现在没有这样做),您需要决定该怎么做。
... main(...) {
Properties properties = loadProperties();
analyzerDriver.analyzers.add(new SummaryReport(properties));
....
编辑我删除了Usman所指的解决方案,让getter返回实例的properties
...属性。
analyzerDriver.analyzers.add(new SummaryReport(analyzerDriver.getProperties()));
答案 1 :(得分:0)
你有几个问题。
main()
是一种静态方法;它无法访问AnalyzerDriver
类的任何非静态变量。 properties
是一个私有实例变量。
之后,您尝试从实例外部(analyzers
)访问私有实例变量(analyzerDriver
)以添加驱动程序。
您可能希望在analyzerDriver
中创建一个公共方法来添加Analyzer
个实例。
public void addAnalyzer(Analyzer a)
{
analyzers.add(a);
}
但这仍然会留下你的财产问题。这实际上取决于您的设计和您正在做的事情,但我可能实现了一个AnalyzerFactory(工厂模式),它加载了属性,然后为您实例化了Analyzer对象:
AnalyzerFactory factory = new AnaylyzerFactory();
Analyzer a = factory.get("SummaryReport");
analyzerDriver.addAnalyzer(a);