簡體   English   中英

詹金斯共享庫不變單身

[英]Jenkins Shared Library Immutable Singleton

我的詹金斯共享庫中有一個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”,因為后備字段是最終字段。

第二次嘗試:

在第二個想法上,我認為在構造函數中進行初始化是可行的,但是我似乎無法訪問paramsenv ,除非它們是通過initialize()方法從vars函數傳入的。

如何使此Singleton類不可變,或者其字段為只讀?

我認為您可以:

  1. 作為文檔建議,使用“序列化實現”定義您的類。
  2. 實施將接受型BaseScript 1個參數,並通過構造this在實例吧, 對於this (你可以調用內部script ),你可以參考script.paramsscript.env等,我的意思是你不必使用initialize ,您可以在c'tor中做所有您想做的事情。

但是,請稍候:

為什么CI / CD代碼需要具有Singleton? 您正在將其數據作為參數傳遞[因此它並不是真正的不可變實體:)]

也許您可以根據您的參數“簡單地”創建一個不變的地圖。

配置為單例感覺就像您可以將配置管理委派給...配置管理服務(領事,etcd或其他)。

請詳細說明,這很好奇!

您也稱“消費者”。 這些圖書館的消費者嗎? 還是工作的人?

謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM