Java编译错误,在方法调用中发送属性

时间:2011-11-02 15:54:33

标签: java properties

我对原始代码进行了一些更改。我仍然需要考虑是否没有加载属性。希望这会奏效。

公共类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();
    }
}

}

2 个答案:

答案 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);