【发布时间】:2013-12-09 09:01:13
【问题描述】:
我有一个工厂,它在我的项目中的太多地方实现,大约 40 个。我希望我的代码与现代技术兼容,并决定使用接口来确保它可以与 Java 8 兼容(lambdas 可以'不实现抽象类)。有没有一种安全的方法,即组合重构来做到这一点?
我有:
class Factory{
String name;
protected Object globalContext;
public abstract Session newSession();
}
我需要:
interface NewSessionFunction{
Session create(Factory enclosingFactory);
}
class Factory{
protected String name;
protected Object globalContext;
protected final NewSessionFunction newSession;
public Factory(NewSessionFunction newSession){
this.newSession = newSession;
}
public Session newSession(){
return newSession.create(this);
}
public Object getData() {return globalContext;}
}
目标是:
new Factory((self) -> new MySession(self))
代替:
new Factory(){
public newSession(){
return new MySession();
}
}
我还没有找到提取 lambda 的方法,但好奇是否有可用的方法?
更新
我的问题是如何轻松重构现有代码,因为我已经有 40 个抽象类的实现。如果使用现有工具无法轻松完成此重构功能,我认为可能会在 IDE 中引入此重构功能。许多 Java 7 代码库工厂理论上可以与 lambda 一起使用,但 Java 8 不允许使用 lambda 实例化它们。所以一个可能的出路是将抽象方法提取到 lambda 中。
【问题讨论】:
-
为什么要把工厂包装成工厂?为什么你不只有一个接口工厂和一个方法 createSession()?我认为应该这样做。
-
这是一个创建会话(lambdas)的工厂,它可以完成一些工作。我需要在多个线程中运行这个 lambda,所以我复制了它。
-
你当前的工厂有额外的字段和方法。谁调用了这些额外的方法?
-
这些字段是一些在会话内部使用的全局信息。此信息可用于安排或调用其他会话。这很复杂,我试图通过要求“提取 lamda 重构”来尽可能地简化它。
-
最后一部分
self到底是什么意思?在同一行中创建的Factory实例?
标签: java lambda refactoring java-8