簡體   English   中英

Java - 創建包廣泛或全局變量的最佳實踐

[英]Java - best practice for creating package-wide or global variables

在Java中創建程序或包的變量的標准方法/最佳實踐是什么?

我想設置一些可由多個類訪問的全局變量。 這些全局變量的例子可能是布爾標志testModeOn,語言設置,當前本地服務器,時間顯示格式等。根據其他一些問題(即這一個 ),沒有任何全局變量,但有一些使用接口(不推薦?)或類的解決方法。 由於原始海報沒有解釋他們的情況,他們幾乎得到了陽光下的每一個答案,我想專門詢問程序配置變量。

創建類/包/接口然后將其導入我的工作類/包更好嗎? 在嘗試使用單獨的類或接口實現這些變量時,我應該注意什么? 有沒有其他方法可以捏造包級變量,因為Java顯然不會本地執行此操作?

注意:除非重新編譯程序,否則這些變量可能不會更改。

如果你在談論常量,那么它們應該被聲明為類中的static final字段(根據Joshua Bloch的說法,從不在接口中)。

如果您正在討論可以隨時更改的設置,那么這些設置可以是類中的static字段,也可以創建ConfigHandler類來管理可配置值的設置和獲取。

將類字段用於可變值可能會導致並發問題,因此如果您的應用程序是多線程的,那么最好創建一個ConfigHandler類來仔細管理並發訪問,並提供synchronized方法以避免出現問題。

在我看來,將任何東西傳遞到您的類中的最佳方法是使用依賴注入。 這將消除您對Singletons,靜態常量等的需求。

根據您喜歡的DI,以下是您描述的問題的一些鏈接解決方案:

如果需要在不同的類中使用多個變量,請創建Bean類。 最佳做法是使用getter和setter創建一個私有變量。

public class ListBean implements Serializable
{
    private boolean testModeOn;
    public boolean getTestModeOn()
    { 
       return testModeOn;
    }
    public setTestModeOn(boolean testModeOn)
    {
        this.testModeOn = testModeOn;
    }

一般來說,有很多方法可以解決這個問題。

簡單的方法是使用Singelton。 這不是一個選擇 - Singelton是一個反模式。 http://c2.com/cgi/wiki?SingletonsAreEvil

那還有什么呢? 具有public static final變量的接口? 不是一個選項 - 這根本不是接口的用例: https//stackoverflow.com/a/2659740/1248724

那還有什么呢? 答案是:

在此輸入圖像描述

我更喜歡的是spring boot方式(例如Dependency Injection)這里有一個代碼示例,顯然是Spring。

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*
@Component
public class MyBean {
 @Value("${name}")
 private String name;
 // ...
}

如果您正在使用類似的框架,那么這些東西可以輕松歸檔。

如果在您的環境中以某種方式不可能,我必須編寫如下代碼:

public final class Configuration {

private Configuration() {
    // make sure there is no instance of this class
}

    public static final MySetting<DateFormat>   setting = new SampleProperty();

    public interface MySetting<T> {
        T get();
    }

    private static final class SampleProperty implements MySetting<DateFormat> {

        @Override
        public DateFormat get() {
            return new SimpleDateFormat("...");
        }

    }

    // other inner classes that implement the MySetting interface
}

public static void main(final String[] args) {
     Configuration.setting.get();
}

優點: - 您可以根據需要驗證您的屬性。 - 如果您願意,可以使用java安全管理器

缺點: - 您可能需要維護一堆代碼(這應該更容易使用lambda表達式) - 就像Spring在這里提供的方式那樣不是那么好。

我發現的一種非常類似的方法: https//stackoverflow.com/a/3931399/1248724

暫無
暫無

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

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