java类,使用不同的参数作为方法的参数

时间:2013-10-13 19:20:37

标签: java

我有一个非常不典型的问题。在我的应用程序中,我有以下代码:

public TaskListDatabases getTaskListDatabases (int mode) {
    switch (mode) {
        case (MODE_NORMAL): 
            if (taskListDatabases == null) {
                taskListDatabases = new TaskListDatabases(app); // 1st place
            }
            break;
        case (MODE_FORCE_RERUN): 
            if (taskListDatabases == null) {
                taskListDatabases = new TaskListDatabases(app); // 2nd place
            } else {
                if (taskListDatabases.getStatus() == AsyncTask.Status.FINISHED)
                    taskListDatabases = new TaskListDatabases(app); // 3rd place
            }
            break;
    }
    return taskListDatabases;
}

现在我想创建4个与上面类似的其他函数,但实际对象构造位置不同(用注释标记)。

在第1代而不是new TaskListDatabases(app)我希望new Task (app, int, int),在第2 new Task (app, String, int),第3 new Task (app, String, String, String) ....

其余的都是一样的。我想知道是否有机会创建一个函数作为"参数"部分new TaskListDatabases(app)。如果这只是课堂问题,那就不会出现问题,因为我会有#34; Class param"。但是这里每个类都有不同的构造函数参数。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您想要的是在abstract factory后面anonymous callback实施的facade。困惑?希望不会在此之后:

定义匿名回调的界面:

private interface TaskFactory {
    Task create();
}

重构基础方法以使用工厂

private Task getTask (int mode, TaskFactory factory) {
    switch (mode) {
        case MODE_NORMAL: 
            if (taskListDatabases == null) {
                taskListDatabases = factory.create();
            }
            break;
        case (MODE_FORCE_RERUN): 
            if (taskListDatabases == null) {
                taskListDatabases = factory.create();
            } else {
                if (taskListDatabases.getStatus() == AsyncTask.Status.FINISHED)
                    taskListDatabases = factory.create();
            }
            break;
    }
    return taskListDatabases;
}

然后为每个目的创建外观方法:

public Task getTaskListDatabases(int mode) {
    return getTask(mode,
        new TaskFactory() {
            Task create() {
                return new TaskListDatabases(app);
            }
        }
    }
}

public Task getTaskOther(int mode) {
    return getTask(mode,
        new TaskFactory() {
            Task create() {
                return new Task(app, "foo", 7; // eg
            }
        }
    }
}

// etc for other Task flavours