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

依赖项注入、初始化后的不可变性

  •  6
  • Ladlestein  · 技术社区  · 14 年前

    我想能够指定一个对象的成员变量在对象被“初始化”之后是不可变的,这对我来说意味着在它被注入任何依赖项之后,并且执行了它只能在DI之后执行的任何其他初始化操作。

    是否有满足我兴趣的语言——以这种方式形式化DI、初始化和支持不可变性?也许让他们成为语言的一部分是愚蠢的,也许不是。我不确定。

    今天我在Java中编程,但是我不能用“最后”来和我想的一样多,因为这些阶段是在构造函数完成后发生的。有什么建议,如何得到我想要的Java?我想我可以让我的对象实现一个基类,以便那些阶段发生在构造函数完成之前,或者使用方面来完成相同的工作。

    思想?

    5 回复  |  直到 14 年前
        1
  •  3
  •   Yishai    14 年前

    我想这取决于你想从不变中得到什么。如果您希望得到保证的线程安全性(所有内容都必须声明为最终的,包括依赖项),那么我认为工厂、生成器或构造函数注入是您唯一的选择。

    但是,如果您只希望状态不变,那么声明状态变量final就足够了。即使不可变的字符串类在其实现中也有可变字段(hashcode值的缓存)。只要您的代码以其他方式确保实例在没有注入的情况下是不可用的,那么一切都应该是好的。

        2
  •  4
  •   mdma    14 年前

    生成不可变对象的主要方法有两种:

    1. 使用生成器/工厂模式-生成器可能是可变的,但它创建的对象是不可变的,通常用最终字段实现。您也可以将这两者结合起来,这样对象本身就可以用来构建新的实例,通常通过“mutator”方法来改变单独的新实例上的状态。斯普林斯 FactoryBean 就是一个例子。

    2. 创建可变对象子类,它维护可变状态的标志。在进行任何更改之前,所有的转换器都要检查可变状态——如果对象被设置为不可变,那么检查会抛出一个异常,否则更改会继续进行。

    第一种方法是以弹簧为中心的,因为它需要实现特定于弹簧的接口。您可以通过创建常规bean的工厂bean factory-method / factory-bean bean上的属性,它从代码中删除了对Spring的依赖。

    使用第二种方法对弹簧特别有用。您可以指示Spring在bean初始化之后调用一个方法,例如seal()来密封对象-使其不可变。或者,您可以实现 BeanFactoryPostProcessor 要自动执行此操作,无需记住设置init method=“seal”。在每个不变的豆子上。

        3
  •  1
  •   Jordão    14 年前

    在爪哇,您可以使用 builder 在其构造函数中初始化一个不可变的对象,这样您就可以避开setter。

    但是,如果使用scala,不可变性是 the default .

        4
  •  0
  •   Mark Peters    14 年前

    在Java中,如果你使用MutoStor方法来进行设置,那么在初始化对象之后添加逻辑以防止更改是相当便宜的(虽然在我看来也很难看)。

    public void setMyProperty(String newValue) {
       checkInitialized();
       myProperty = newValue;
    }
    
    public void checkInitialized() {
       if ( initialized ) {
          throw new IllegalStateException("Setter called after initialization");
       }
    }
    

    不过,最好是进行动态检查。它不会给你任何关于你已经拥有的东西的静态反馈。

        5
  •  0
  •   Espen    14 年前

    要指定类是不可变的,可以使用 @Immutable 注释。

    你可以看到JavaDoc here .

    这与Eclipse中的findbugs插件很好地配合。

    @亚力山大:

    据我所知,他问如何指定类是不可变的。不是如何编写不可变类。此注释可以为您提供工具支持,以验证您的类中没有声明为不可变的bug。

    JavaDoc的一个片段:

    这就意味着 公共领域是最终的,这一切 公共最终引用字段引用 其他不变对象

    推荐文章