Использовать универсальные для предотвращения дублирования кода в этом случае


У меня есть эта иерархия классов. Хочу использовать дженерики, но не знаю как это сделать. AddWikiTask, ScanTask и RescanTask являются подклассами AbstractWorkerTask. DictionaryScanner имеет 3 функции, чтобы проверить, если все задачи закончить. Как предотвратить дублирование кода в 3 эти функции?

Это иерархия классов

    public abstract class AbstractWorkerTask<Params, Progress, Result>
    extends AsyncTask<Params, Progress, Result>
    implements Workable {
    ...}

    class AddWikiTask extends AbstractWorkerTask<String, Void, Pair<Integer, Dictionary>> {
    ...}

    class ScanTask extends AbstractWorkerTask<DictionaryBean, Void, Pair<Integer, Dictionary>> {
    ...}

    class RescanTask extends AbstractWorkerTask<DictionaryInformation, Void, Pair<Integer, Dictionary>> {
    ...}

Это DictionaryScanner.

public final class DictionaryScanner { 
    private final List<RescanTask> rescanTasks = new ArrayList<RescanTask>();
    private final List<ScanTask> scanTasks = new ArrayList<ScanTask>();
    private final List<AddWikiTask> wikiTasks = new ArrayList<AddWikiTask>();

        public boolean didAllRescanTasksFinish() {
            for (final RescanTask task : rescanTasks) {
                if (task.isWorking()) {
                    return false;
                }
            }
            return true;
        }

        public boolean didAllAddWikiTasksFinish() {
            for (final AddWikiTask task : wikiTasks) {
                if (task.isWorking()) {
                    return false;
                }
            }
            return true;
        }

        public boolean didAllScanTasksFinish() {
            for (final ScanTask task : scanTasks) {
                if (task.isWorking()) {
                    return false;
                }
            }
            return true;
        }
}

Редактировать: и применение универсальной для этого. Это слишком долго. Я действительно не знаю, как рефакторинг.

private void setOnPreExecuteForAddWikiTask(final AddWikiTask task, final ProgressDialog progressDialog) {
    task.setOnPreExecuteListener(new OnPreExecuteListener() {
        @Override
        public void onPreExecute() {
            if (didAllAddWikiTasksFinish()) {
                progressDialog.show();
            }
        }
    });
}

private void setOnPreExecuteForRescanTask(final RescanTask task, final ProgressDialog progressDialog) {
    task.setOnPreExecuteListener(new OnPreExecuteListener() {
        @Override
        public void onPreExecute() {
            if (didAllRescanTasksFinish()) {
                progressDialog.show();
            }
        }
    });
}

private void setOnPreExecuteForScanTask(final ScanTask task) {
    task.setOnPreExecuteListener(new OnPreExecuteListener() {
        @Override
        public void onPreExecute() {
            if (didAllScanTasksFinish() && progressBar != null) {
                progressBar.setVisibility(ProgressBar.VISIBLE);
            }
        }
    });
}

Если фрагмент не достаточно подробно, пожалуйста, дайте мне знать.



695
1
задан 9 октября 2011 в 08:10 Источник Поделиться
Комментарии
1 ответ

Вы можете взять общий код в функции в DictionaryScanner в обычным методом:

    public boolean didAllRescanTasksFinish() {
didAllXTasksFinish(rescanTasks);
}

private boolean didAllXTasksFinish(List<AbstractWorkerTask> tasks) {
for (final AbstractWorkerTask task : tasks) {
if (task.isWorking()) {
return false;
}
}
return true;
}

В противном случае ваш второй блок кода-это примерно так же просто, как вы можете сделать, потому что каждый слушатель имеет различное содержание. Если вы пытаетесь удалить шаблон, вы найдете его гораздо более трудным для понимания.

2
ответ дан 10 октября 2011 в 09:10 Источник Поделиться