詹金斯共享图书馆不可变单身人士

时间:2018-03-24 15:45:33

标签: jenkins groovy singleton immutability

我的Jenkins共享库中有一个Singleton模式类:

public class Configuration {

    private static final INSTANCE = new Configuration()

    static getInstance() { return INSTANCE } 

    private Configuration() {
    }

    def initialize(env, params) {
        Foo = params.FOO;
    }

    public String Foo = ''
}

稍后我可以使用类似的东西从其他地方调用它:

Configuration.instance.initialize(env, params);
config = Configuration.instance;
println 'FOO: ' + config.Foo

理想情况下,我希望获得Singleton模式的好处,但我不希望某些字段被消费者覆盖。

首次尝试:

首先想到的是,我认为这样可行:

public class Configuration {

    private static final INSTANCE = new Configuration()

    static getInstance() { return INSTANCE } 

    private Configuration() {
    }

    def initialize(env, params) {
        INSTANCE.@Foo = params.FOO;
    }

    public final String Foo = ''
}

错误:

  

groovy.lang.GroovyRuntimeException:无法设置属性' Foo'因为支持领域是最终的。

第二次尝试:

On Second think,我认为在构造函数中初始化会起作用,但我似乎无法访问paramsenv,除非这些是从vars函数传入的,通过initialize()方法。

如何使这个Singleton类不可变,或者只读它的字段?

1 个答案:

答案 0 :(得分:0)

我认为您可以:

  1. 作为文档建议,使用“可序列化的实现”定义您的类。
  2. 实施将接受1个BaseScript类型参数的构造函数,并在实例化时将this传递给它,相对于那个 this(您可以将其称为内部{{ 1}}),您可以参考scriptscript.params等。我的意思是您不必使用script.env,您可以在c'tor中做所有您想做的事情。

但是,请稍候:

为什么CI / CD代码需要具有Singleton? 您正在将其数据作为参数传递[因此它并不是真正的不可变实体:)]

也许您可以根据您的参数“简单地”创建一个不变的地图。...

单例配置就像您可以将配置管理委派给...配置管理服务(领事,etcd或其他)一样。

请详细说明,这很好奇!

您还称其为“消费者”。这些图书馆的消费者吗?或负责工作的人?

谢谢!

相关问题