Как анонимный класс может иметь аргументы? - PullRequest
2 голосов
/ 06 декабря 2011

Я не Java-парень, но я унаследовал некоторый код, который мне нужно исправить.Я извлек исходный код в netbeans и получаю ошибку: класс Anonymous реализует интерфейс;не может иметь аргументов.

Вот код:

Executor background = Executors.newSingleThreadExecutor();
Runnable mylookupThread = new Runnable(FilePath, SearchIndex)
{
    public void run()
    { MainWindow.this.processFile(this.val$FilePath);
        Thread t = new Thread(new lookupThread(MainWindow.arrFile, true, false, this.val$SearchIndex));
        t.setName("Lookup");
        t.setPriority(10);
        t.start();
    }
};
background.execute(mylookupThread);
Executor statusThread = Executors.newSingleThreadExecutor();
Runnable myStatusThread = new Runnable()
{
    public void run()
    { MainWindow.this.updateStatus();
    }
};
statusThread.execute(myStatusThread);

Ошибка появляется во второй строке.Помощь?!? * * 1006

Ответы [ 4 ]

3 голосов
/ 06 декабря 2011

Создайте mylookupThread отдельный класс, создайте его экземпляр и передайте его Executor:

class LookupTask implements Runnable {
    private final String filePath, searchIndex;
    LookupTask(String filePath, String searchIndex) {
       this.filePath = filePath;
       this.searchIndex = searchIndex;
    }

    public void run() { ... } 
}
...
background.execute(new LookupTask(filePath, searchIndex));

Другой способ сделать filePath, searchIndex финал:

final String filePath = ...
final String searchIndex = ...
Executor background = Executors.newSingleThreadExecutor();
Runnable mylookupThread = new Runnable() {
    public void run() { MainWindow.this.processFile(filePath);
        Thread t = new Thread(new lookupThread(MainWindow.arrFile, true, false, searchIndex));
        t.setName("Lookup");
        t.setPriority(10);
        t.start();
    }
};
background.execute(mylookupThread);
1 голос
/ 06 декабря 2011

@ Виктор прав, что вы можете создать еще один класс.Вы также можете использовать переменные внутри анонимного класса, которые final.Будет работать что-то вроде следующего.

Executor background = Executors.newSingleThreadExecutor();
private final FilePath filePath = ...;
private final String searchIndex = ...;
Runnable mylookupThread = new Runnable() {
    public void run() {
        MainWindow.this.processFile(filePath);
        Thread t = new Thread(new lookupThread(MainWindow.arrFile, true, false,
           searchIndex));
        t.setName("Lookup");
        t.setPriority(10);
        t.start();
    }
};

Кстати.Немного странно создавать поток внутри Runnable потока, выполняющегося в исполнителе.Не уверен, почему бы вам просто не создать LookupThread напрямую и полностью удалить анонимный класс.

1 голос
/ 06 декабря 2011

Анонимный класс в форме new -interface- неявно расширяет Object.Вы должны использовать один из конструкторов для объекта .Есть только один - конструктор без аргументов.

0 голосов
/ 06 декабря 2011

Это проблемная строка (как вы сказали:)

Runnable mylookupThread = new Runnable(FilePath, SearchIndex) { ...

То, что происходит, заключается в том, что мы определяем класс на лету, и этот класс реализует интерфейс Runnable. Когда вы используете этот синтаксис, элементы в скобках предназначены в качестве аргументов конструктора для суперкласса. Поскольку Runnable является интерфейсом, а не классом, у него вообще нет конструкторов, поэтому определенно нет аргументов, которые бы принимали аргументы.

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

...