背景:
我们正在重构代码以转向微服务。我们'已经 多个产品(A,B,C和单片A,B,C的一些通用代码) 服务)。现在我们为公共代码创建新的沙箱。
问题:
User.java
Class User {
public **static** void init(){
List<Items> users=Items.getItemsList();
}
}
Items.java
Class Items {
public **static** Items getItemsList(){
//many static functions and dependancy
return items;
}
}
所以在这里,两个函数都是静态的,我想只移动User.java 到新的沙箱而不是Items.java。我怎么能解散这种依赖性呢? 我不能使User.init()非静态
答案 0 :(得分:1)
假设 sandbox 是指生成jar的独立项目,那么“Items”也必须存在于沙箱中,否则将无法编译。
但是你可以从Items
中提取一个界面,例如IItems
(原谅可怕的名字)。
public interface IItems {
// methods...
}
包含在沙盒中。
为工厂创建一个界面,例如:
public interface IItemsFactory {
List<IItem> create();
}
也包含在沙箱中。
丑陋的部分是将User.init()
保持为静态。使用hacky IoC模式,将IItemsFactory
的实现设置为User。工厂也必须是静态的。所以User
就变成了:
public class User {
private static volatile IItemsFactory factory;
public static setFactory(IItemsFactory factory) {
User.factory = factory;
}
public static void init() {
List<IItems> users = factory.getItemsList();
}
}
A,B和C项目负责提供IItemFactory的实现并在调用User.init()
之前设置它。
这是半生不熟的,那些静态方法需要在下一次重构迭代过程中消失。仍然使用IoC模式,但将工厂注入User
构造函数的一部分。
public class User {
private IItemsFactory factory;
public User(IItemsFactory factory) {
this.factory = factory;
}
public void init() {
List<IItems> users = factory.getItemsList();
}
}