Java 我如何分解这段代码?

Java 我如何分解这段代码?,java,function,call,Java,Function,Call,我正在开发一个调用web服务的java web服务器。我想用更好的语言写一些代码 我有两个类似的函数,只有一个变化:我必须调用的函数取决于我想做什么 public Object updateDef() { ExecutorService pool = Executors.newFixedThreadPool(20); List<Callable<String>> tasks = new ArrayList<Callable<String>

我正在开发一个调用web服务的java web服务器。我想用更好的语言写一些代码

我有两个类似的函数,只有一个变化:我必须调用的函数取决于我想做什么

public Object updateDef() {
    ExecutorService pool = Executors.newFixedThreadPool(20);
    List<Callable<String>> tasks = new ArrayList<Callable<String>>();

    logger.info("Updating surv def...");

    for (final Surv surv : Client.activatedSurvs) {
        final Client client = new Client(surv.getName(), surv.getPassword());

        tasks.add(new Callable<String>() {
            public String call() throws Exception {
                HERE -> client.updateDef(surv);
                return surv.getId();
            }
        });
        client.destroy();
    }

    List<Future<String>> results = null;
    try {
        results = pool.invokeAll(tasks);
        for (Future<String> future : results) {
            future.get();

        }
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    pool.shutdown();

    return null;
}
public Object updatedf(){
ExecutorService池=Executors.newFixedThreadPool(20);
列表任务=新建ArrayList();
logger.info(“更新surv def…”);
用于(最终Surv Surv:Client.activatedsurv){
最终客户端=新客户端(surv.getName(),surv.getPassword());
tasks.add(newcallable()){
公共字符串调用()引发异常{
这里->client.updatedf(surv);
返回surv.getId();
}
});
client.destroy();
}
列表结果=空;
试一试{
结果=pool.invokeAll(任务);
用于(未来:结果){
future.get();
}
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
pool.shutdown();
返回null;
}
另一个:

public Object updateStats() {
    ExecutorService pool = Executors.newFixedThreadPool(20);
    List<Callable<String>> tasks = new ArrayList<Callable<String>>();

    logger.info("Updating surv Stats...");

    for (final Surv surv : Client.activatedSurvs) {
        final Client client = new Client(surv.getName(), surv.getPassword());

        tasks.add(new Callable<String>() {
            public String call() throws Exception {
                HERE -> client.updateStats(surv).toString();
                return surv.getId();
            }
        });
        client.destroy();
    }

    List<Future<String>> results = null;
    try {
        results = pool.invokeAll(tasks);
        for (Future<String> future : results) {
            future.get();
        }
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    pool.shutdown();

    return null;
}
public Object updateStats(){
ExecutorService池=Executors.newFixedThreadPool(20);
列表任务=新建ArrayList();
logger.info(“更新surv统计…”);
用于(最终Surv Surv:Client.activatedsurv){
最终客户端=新客户端(surv.getName(),surv.getPassword());
tasks.add(newcallable()){
公共字符串调用()引发异常{
HERE->client.updateStats(surv.toString();
返回surv.getId();
}
});
client.destroy();
}
列表结果=空;
试一试{
结果=pool.invokeAll(任务);
用于(未来:结果){
future.get();
}
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
pool.shutdown();
返回null;
}
因此,这两个函数是来自类A的updateStats和updateDef,以及来自B的静态列表。 问题是我必须传递一个参数,该参数是此列表中的现有元素

=>A.updateStats(B.list.get(X))

=>A.updatedf(B.list.get(X))

我访问了这个链接,但没有成功


有什么想法吗?

您可以使用策略模式或函子。老实说,我想我应该把常见的部分分解成共享的方法。

可调用的
中轻松传递,不要重复它周围的所有样板文件

public Object foo(Callable<String> callable) {
    ExecutorService pool = Executors.newFixedThreadPool(20);
    List<Callable<String>> tasks = new ArrayList<Callable<String>>();

    logger.info("Updating surv def...");

    for (final Surv surv : Client.activatedSurvs) {
        final Client client = new Client(surv.getName(), surv.getPassword());
        tasks.add(callable;
        client.destroy();
    }

    List<Future<String>> results = null;
    try {
        results = pool.invokeAll(tasks);
        for (Future<String> future : results) {
            future.get();

        }
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    pool.shutdown();

    return null;
}
公共对象foo(可调用){
ExecutorService池=Executors.newFixedThreadPool(20);
列表任务=新建ArrayList();
logger.info(“更新surv def…”);
用于(最终Surv Surv:Client.activatedsurv){
最终客户端=新客户端(surv.getName(),surv.getPassword());
任务。添加(可调用;
client.destroy();
}
列表结果=空;
试一试{
结果=pool.invokeAll(任务);
用于(未来:结果){
future.get();
}
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
pool.shutdown();
返回null;
}

您的目标是替换:

tasks.add(new Callable<String>() {
        public String call() throws Exception {
            client.updateStats(surv).toString();
            return surv.getId();
        }
    });
然后,将此接口用作方法的参数:

public Object updateStats() {
变成

public Object update(ClientUpdate updater) {
然后在你的呼叫中使用它

tasks.add(new Callable<String>() {
        public String call() throws Exception {
            updater.performUpdate(client, surv);
            return surv.getId();
        }
    });
变成:

update(new ClientUpdate() {
    public void performUpdate(Client client, Surv surv) {
        client.updateStats(surv).toString();
    }
});

类似地,对于
updatedf();

这个问题更适合在函数的参数中传递一个布尔值,比如'isDef',并与if语句一起调用其中一个更新行。你链接的问题给出了一个完全有效的答案。任何形式的
接口
都可以。我忘了说这是最快的方式可能。我担心语句是否会减慢我的应用程序的速度?是的,但不是,因为可调用依赖于
客户端和
surv
。我的重点是传递那些改变的东西。这个想法仍然成立。不是真的,因为可调用本身会改变(为了使其不发生变化,它不应该只是一个可调用的,还应该能够为客户端和surv提供参数)。将需要的作为参数提供给可调用的。仍然可以按我的方式执行。可调用的
本身不知道任何参数。
tasks.add(new Callable<String>() {
        public String call() throws Exception {
            updater.performUpdate(client, surv);
            return surv.getId();
        }
    });
updateStats();
update(new ClientUpdate() {
    public void performUpdate(Client client, Surv surv) {
        client.updateStats(surv).toString();
    }
});