代码之家  ›  专栏  ›  技术社区  ›  kiran

通过构造函数注入将静态类切换为常规类,还是通过方法注入保持静态以进行增强?

  •  -1
  • kiran  · 技术社区  · 1 年前

    我遇到了一个代码修改,它向静态类添加了一个依赖项,该依赖项通过方法注入传递。是否建议选择构造函数注入而不是方法注入?在选择这两种方法时,有没有需要注意的陷阱?

    初始版本

    public class Mapper {
    private final A a;
    
    public K getConstraint(A a){
     final boolean bool = isFeasible(ex);
     ...
     a.something();
     }
    }
    
    public final class Util {
    
      public static boolean isFeasible(String ex) {
        return ex.equals(something);
    
      }
    }
    
    
    

    版本1:保持静态并使用方法注入

    @RequiredArgsConstructor(onConstructor = @__({@Inject}))
    public class Mapper {
    private final A a;
    private final Order order;
    
    public Map<C,D> getConstraint(A a, Order order){
     final boolean bool = isFeasible(ex, order);
     ...
     a.something();
     }
    }
    
    public final class Util {
    
      public static boolean isFeasible(String ex, Order order) {
       if (X) {
        return ex.equals(something);
       }
       return order.something();
      }
    }
    

    版本2:使其成为常规类并使用构造函数注入

    @RequiredArgsConstructor(onConstructor = @__({@Inject}))
    public class Mapper {
      private final A a;
    
      public Map<C,D> getConstraint(){
      final boolean bool = isFeasible(ex);
      ...
      a.something();
     }
    }
    
    @RequiredArgsConstructor(onConstructor = @__({@Inject}))
    public class Util {
      private final Order order;
    
      public boolean isFeasible(String ex) {
       if (X) {
        return ex.equals(something);
       }
       return order.something();
    
     }
    }
    
    }
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Mark Seemann    1 年前

    作为一般观察, Dependency Injection is just passing arguments ,因此不需要注释。

    那么,选择是通过构造函数传递参数还是作为方法参数传递参数。

    有没有办法在两者之间做出选择?

    当所涉及的类是不是任何多态API的一部分的具体类时(即,它们既没有从基类继承,也没有实现接口),没有太大的区别。

    如果需要依赖项的类实现多态API,情况就会改变。在这种情况下,您可能无法更改方法签名,因为它们已经(由基类或接口)给定了。此外,客户端代码可能无法访问依赖项;通常,依赖注入的要点是将对象组合与对象交互解耦。

    在这些情况下(最常见的) 不能 通过方法传递依赖项,因为这会破坏契约(或违反 Dependency Inversion Principle )。那么,通过消除,您将不得不通过构造函数传递依赖关系。

    话虽如此,小心 cohesion sequential coupling 。如果将依赖项作为方法参数传递,则它不应该也是类字段。