我的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,我认为在构造函数中初始化会起作用,但我似乎无法访问params
和env
,除非这些是从vars函数传入的,通过initialize()
方法。
如何使这个Singleton类不可变,或者只读它的字段?
答案 0 :(得分:0)
我认为您可以:
this
传递给它,相对于那个 this
(您可以将其称为内部{{ 1}}),您可以参考script
,script.params
等。我的意思是您不必使用script.env
,您可以在c'tor中做所有您想做的事情。 但是,请稍候:
为什么CI / CD代码需要具有Singleton? 您正在将其数据作为参数传递[因此它并不是真正的不可变实体:)]
也许您可以根据您的参数“简单地”创建一个不变的地图。...
单例配置就像您可以将配置管理委派给...配置管理服务(领事,etcd或其他)一样。
请详细说明,这很好奇!
您还称其为“消费者”。这些图书馆的消费者吗?或负责工作的人?
谢谢!