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

Java 代码重构,如何分解两个静态函数而不使父函数成为非静态函数,java,algorithm,spring-mvc,generics,dependency-injection,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 Cl

背景:

我们正在反思代码,以便转向微服务。我们已经 多个产品(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
类用户{
公共**静态**无效初始化(){
List users=Items.getItemsList();
}
}
Items.java
类别项目{
公共**静态**项getItemsList(){
//许多静态函数和依赖性
退货项目;
}
}
在这里,这两个函数都是静态的,我只想移动User.java 创建新的沙盒而不是Items.java。我怎样才能解除这种依赖。 我不能使User.init()成为非静态的

假设sandbox意味着一个独立的项目产生一个jar,那么“Items”也必须存在于sandbox中,否则它将无法编译

但是您可以从
提取一个接口,例如
IItems
(请原谅这个糟糕的名称)

它包含在沙箱中

并为工厂创建一个接口,例如:

public interface IItemsFactory {
    List<IItem> create();
}
A、B和C项目负责提供IItemFactory的实现,并在调用
User.init()
之前对其进行设置

这是半生不熟的,这些静态方法需要在下一次重构迭代中消失。仍然使用IoC模式,但将工厂作为
用户
构造函数的一部分注入

public class User {
    private IItemsFactory factory;

    public User(IItemsFactory factory) {
        this.factory = factory;
    }

   public void init() {
       List<IItems> users = factory.getItemsList();
   }
}
公共类用户{
私营物资工厂;
公共用户(IItemsFactory工厂){
这个工厂=工厂;
}
公共void init(){
List users=factory.getItemsList();
}
}

“我[sic]不能使
User.init()
non-static”多么遗憾,因为这正是你应该做的。“创建新沙盒”或“将[only]User.java移动到新沙盒”意味着什么,这是如何“分解这种依赖性[sic]”,为什么这意味着该方法的
静态
修饰符必须更改?@Holger,因为有多个产品正在使用User.java。因此,我们正在为User.java、Order.java等常见文件创建一个新的沙盒。。。因此,该场景将是产品A的沙盒+公共文件的沙盒产品B的沙盒+公共文件的沙盒…最终导致微服务。你对这件事还有别的想法吗?请建议?@LewBloch这是遗留代码。不幸的是,我不能使其成为非静态的,因为User.init()在服务器部署时启动。您仍然没有解释“沙盒”的含义。也不清楚为什么这会“最终导致微服务”,但无论如何,为什么这意味着该方法的静态修改器必须改变?由于您的问题是关于
静态
修饰符的,所以这是最重要的问题/设置工厂/初始化公共用户(IItemsFactory工厂){this.factory=factory;}我假设在产品/项目A、B、C中的某个地方调用了
init()
。在调用
init()
之前,需要在那里做一些小的更改来设置工厂。
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();
   }
}
public class User {
    private IItemsFactory factory;

    public User(IItemsFactory factory) {
        this.factory = factory;
    }

   public void init() {
       List<IItems> users = factory.getItemsList();
   }
}