簡體   English   中英

靜態變量與單例

[英]Static variable vs singleton

我正在制作Java REST應用程序。 我想知道我應該如何實現我的服務-我應該為整個應用程序使用靜態服務變量還是像在Spring MVC中那樣使服務成為單例。 在應用期間,單例對象和僅初始化對象之間有什么區別?

如果您想擁有一些實用的方法或常量變量,則應選擇使用Static;而當類可以具有狀態並且狀態可以更改(但對象仍然是一個)時,Singelton就會出現。

將服務創建為單例,這樣可以在運行時獲得更大的靈活性,因為您可以注入服務的任何實現而無需更改代碼。 如果您的想法是使用服務類共享某些變量,則將其標記為最終變量。

從根本上說,我們使對象在系統中成為單例的事實是,我們需要確保除了創建的對象之外,不會創建其他任何對象。 將單例對象作為安全漏洞,資源掛起問題等可能有很多原因。 但是,仍然沒有這樣的方法,這僅僅是做這種事情的正確方法。 但是使用Spring MVC有其自身的優勢,我們不需要管理實例,因為它已經由spring處理。 例如,涉及服務時,您可能需要將一些配置加載到服務中才能運行。 通過使用Spring MVC bean,可以在運行時更改您的配置而無需重新部署。

@Service
@RefreshScope
@EnableConfigurationProperties(UserManagementConfig.class)
public class UserManagementService
{

此UserManagementService是spring服務,它將是spring上下文內的單例bean,其配置通過UserManagementConfig類加載。 這樣,您便擁有了我上面提到的優勢。 因此,如果您創建靜態實例,則無法執行此操作。 所以我的建議是最好使用Spring MVC。

我應該為整個應用程序使用靜態服務變量還是將服務作為單例

這取決於。 您必須問自己兩個問題才能得出答案:

static variable存儲在哪里?

您有2個選項:

  1. 聲明一個final class Services ,它將所有可用服務作為public static final變量保存。
  2. 在每個服務類中創建一個public static final變量,稱為INSTANCE

您會看到第一點將所有類都放在同一位置。 可能會變得集群化,難以理解並且很難維護。

第二點,您幾乎接近單例情況。

我需要懶惰還是急於初始化服務?

您再次有2個選擇:

  1. 懶惰:第一次使用靜態持有人樣式來懶惰初始化單例
  2. 急切地:在服務類中創建一個public static final變量,然后直接創建一個實例。

第一點是它的好處。 如果您需要分配資源或需要執行任何其他“繁重的”操作。 這有效,並且是線程安全的

對於第二點,您會看到這就像第一個問題的第二點。

結論

如前所述,這取決於用例。 我可能總是會使用單例。 因為這樣所有關於它的狀態和可用性的邏輯都被保存在一個地方。

暫無
暫無

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

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