Ошибка компиляции Java, отправка свойств в вызове метода - PullRequest
0 голосов
/ 02 ноября 2011

Я внес некоторые изменения в исходный код. Я все еще должен учитывать, если свойства не загружаются, хотя. Надеюсь, это сработает.

открытый класс 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 []) {

    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 ]

2 голосов
/ 02 ноября 2011

Ваш метод 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()));
0 голосов
/ 02 ноября 2011

У вас есть пара проблем.

main() - статический метод; он не может получить доступ к любым нестатическим переменным класса AnalyzerDriver. properties является частной переменной экземпляра.

После этого вы пытаетесь получить доступ к закрытой переменной экземпляра (analyzers) снаружи экземпляра (analyzerDriver), чтобы добавить свои драйверы.

Возможно, вы хотите создать публичный метод в analyzerDriver для добавления Analyzer экземпляров.

public void addAnalyzer(Analyzer a) 
{ 
    analyzers.add(a);
}

Но это все еще оставляет проблему ваших свойств. Это действительно зависит от вашего дизайна и от того, что вы делаете, но я бы, вероятно, реализовал AnalyzerFactory (шаблон Factory), который загрузил свойства и затем создал бы ваши объекты Analyzer для вас:

AnalyzerFactory factory = new AnaylyzerFactory();
Analyzer a = factory.get("SummaryReport");
analyzerDriver.addAnalyzer(a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...