Java 我如何分解这段代码?
我正在开发一个调用web服务的java web服务器。我想用更好的语言写一些代码 我有两个类似的函数,只有一个变化:我必须调用的函数取决于我想做什么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>
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();
}
});