簡體   English   中英

在 Java 中實現啟用/禁用方法的最佳方法是什么?

[英]What is the best approach for implementing enable/disable methods in Java?

在 Java 中,給定一對公共方法 enableFoo 和 disableFoo,它們分別將名為 isEnabledFoo 的布爾字段設置為 true 或 false,該方法是否應該在設置之前檢查 Foo 是否已啟用? 如果是,是否應該拋出異常? 如果是,應該選中還是不選中? 如果未選中,它應該拋出什么? 非法狀態異常?

一個轉折:雖然當前的實現只是設置了一個布爾字段,但我故意不將它實現為一個帶有布爾參數的 setFoo“setter”方法,因為稍后可能會更改實現以包含副作用(甚至可能不設置字段一點)。 將其保持為 enableFoo/disableFoo 似乎是保證封裝的最佳方式。

我應該這樣做嗎:

public void enableFoo() throws myCheckedException
{
  if (! this.isEnabledFoo)
  {
    this.isEnabledFoo = true;
  }
  // Is this overkill?
  else
  {
    // Foo is already enabled...Should a checked exception be thrown?
    throw new myCheckedException ("Foo is already enabled.");

    // What about an unchecked exception?
    // throw new IllegalStateException ("Foo is already enabled.");
  }
}

或者簡單地像這樣:

public void enableFoo()
{
  // I guess we don't care if foo is already enabled...
  this.isEnabledFoo = true;
}

甚至:

public void enableFoo()
{
  // Is this just code bloat?
  if (! this.isEnabledFoo)
  {
    this.isEnabledFoo = true;
  }
}

我認為雖然最后兩個版本更簡單,但它們會隱藏一個可能的錯誤,即開發人員調用 enableFoo 認為它已被禁用,而實際上它已經被啟用(但這真的很重要嗎?)。 這里最好的設計是什么?

我真的不認為你的問題有答案。 所有這些似乎都有效,這取決於您正在執行的操作以及操作后對象的一致狀態。

例如:我有一個方法可以啟用語法突出顯示,如果您選擇啟用它並且它已經啟用,您會關心什么。 在這種情況下,您只需設置布爾標志,而不管之前的狀態(選項 2)。

另一方面,如果我不只是更改布爾字段,而是執行一些復雜的邏輯,這些邏輯重新運行可能會很昂貴,例如遍歷文檔的 DOM 並為所有我不想做的正確位置着色再次只是因為有人“重新檢查”了啟用標志。

像這樣的東西:

public void enableHighlighting() {
  if (!isHighlighting) {
    isHighlighting = true;
    colorView();  // very expensive method
  }
}

現在讓我們假設您有一種情況,其中雙重啟用反映了機器的不一致狀態(類似於您將使用assert的情況。在這種情況下,您可能想要拋出異常以表示用戶做了非法的事情。

例如,假設語法高亮僅影響某些類型的文件,例如 XML 或 Java 代碼,並且用戶嘗試將其應用於 PHP 代碼。 現在突出顯示已經啟用,但沮喪的用戶嘗試啟用它,因為他沒有看到任何變化。 在這種情況下,您可能希望向用戶打印一條消息,說明已啟用突出顯示。 在這種情況下,是否發生更改的返回值可能更有意義,但您也可以使用異常。

返回值:

public boolean enableHighlighting() {
  prevState = isHighlighting;
  isHighlighting = true;
  return prevState != isHighlighting; //return true if value changed
}

不。 你為什么要關心? enableFoodisableFoo是非常明確的-一個允許,其他禁用。 無需檢查當前狀態。

如果你真的想要,你可以返回一個布爾值來指示以前的狀態。 你也可以有一個public boolean isEnabled()方法。

沒有直接的答案。 這取決於需求。 具體來說你的操作是否是冪等的。

http://en.wikipedia.org/wiki/Idempotence

如果您的程序是多線程的,建議鎖定啟用和禁用功能,如果鎖定不是原子的,檢查可能會有所幫助。 否則你不需要擔心檢查狀態。

您可以使用Facet來啟用/禁用功能。

免責聲明:我是該平台的作者之一

您可以將方面視為應用程序的所有方法。 您可以在運行時啟用/禁用方法。

如何整合:

  • Maven 中心獲取包
  • 將它添加到 gradle 配置: implementation 'run.facet.agent.java:facet-agent:0.0.8'
  • 創建一個facet.yml
workspaceId: WORKSPACE~ID
name: My-Application
environment: dev
apiKey: API_KEY

注意:您可以從Facet 儀表板中獲取這些鍵

  • 集成完成后,您可以從系統實時啟用/禁用方法。 請注意,無需重新部署或重新啟動應用程序。

為了讓您了解它與其他人提到的功能標志有何不同,您可以認為分面會自動應用於您的應用程序,而不是每次開發功能時都以編程方式聲明。

注意:這還不是生產就緒的。 很高興與您一起解決問題!

暫無
暫無

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

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