代码重构,如何分解两个静态函数而不使父函数非静态

时间:2017-09-07 15:57:24

标签: java algorithm spring-mvc generics dependency-injection

背景:

  

我们正在重构代码以转向微服务。我们'已经   多个产品(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()非静态

1 个答案:

答案 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();
   }
}