亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

靜態工廠方法怎么在Java項目中實現

發布時間:2020-12-04 16:26:11 來源:億速云 閱讀:148 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關靜態工廠方法怎么在Java項目中實現,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

什么是靜態工廠方法

對于類而言,為了讓使用者獲取它自身的一個實例,最常用的方法就是提供一個公有的構造器。
當然,這里要介紹的是另一種方法——靜態工廠方法,一個返回類的實例的靜態方法。
舉個例子,Boolean的一個將基本類型boolean轉為封裝類的方法,valueOf:

public static Boolean valueOf(boolean b) { 
  return (b ? TRUE : FALSE); 
} 

為什么要使用靜態工廠方法

那么,我們為什么要使用靜態工廠方法,而不是使用構造器呢?

因為靜態工廠方法,具有以下三個特點——具名、環保、多子,下面一個個來講。

> 具名  靜態工廠方法有名稱

對于構造器來說,根據入參的不同可以有多個構造器,但是這些構造器的名稱都是一樣的,使用者在調用時就會一頭霧水,到底應該調用哪一個呢。

而使用了靜態工廠方法之后,你可以根據方法的功能給方法起不同的名字,只有名字起得好,使用者看到方法名就知道是什么意思,知道這時候應該調用哪一個方法,大大提高了代碼的可讀性。

> 環保  不必每次調用的時候都創建一個新對象

使用構造器,每次都會產生一個新的對象。

而靜態工廠方法,可以重復地返回預先創建好的對象。

上面Boolean就是一個非常好的例子,TRUE和FALSE兩個變量都是預先創建好的,而且都是不可變的final對象,誰需要用到了,就給它返回過去,也不用擔心被修改了。

下面就是TRUE和FALSE兩個變量的初始化代碼:

public final class Boolean implements java.io.Serializable, 
                   Comparable<Boolean> 
{ 
  /** 
   * The {@code Boolean} object corresponding to the primitive 
   * value {@code true}. 
   */ 
  public static final Boolean TRUE = new Boolean(true); 
 
  /** 
   * The {@code Boolean} object corresponding to the primitive 
   * value {@code false}. 
   */ 
  public static final Boolean FALSE = new Boolean(false); 
 
  ...   
} 

> 多子  可以返回原返回類型的任何子類型的對象

使用構造器,你只能返回一種類型的對象;而使用靜態工廠方法,你可以根據需要,返回原返回類型的任何子類型的對象。
以EnumSet的noneof方法為例:

/** 
 * Creates an empty enum set with the specified element type. 
 * 
 * @param elementType the class object of the element type for this enum 
 *   set 
 * @throws NullPointerException if <tt>elementType</tt> is null 
 */ 
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) { 
  Enum[] universe = getUniverse(elementType); 
  if (universe == null) 
    throw new ClassCastException(elementType + " not an enum"); 
 
  if (universe.length <= 64) 
    return new RegularEnumSet<>(elementType, universe); 
  else 
    return new JumboEnumSet<>(elementType, universe); 
} 

這個方法,出于性能的考慮,具體返回什么類型,由枚舉類型的數量決定,超過64,則返回JumboEnumSet,否則返回RegularEnumSet,而這兩種類對于使用者來說是不可見的,使用者只需要知道他是EnumSet就好。

也正是因為靜態工廠方法有著比構造器更大的優勢,我們在創建類時,切忌第一反應就是提供公有構造器,要優先考慮靜態工廠方法。

常見的靜態工廠方法名

這里附上靜態工廠方法的一些約定俗成的名稱:

valueOf/Of——類型轉換,返回的實例和入參具有相同的值,比如Boolean.valueOf()、EnumSet.valueOf()
getInstance——返回一個預先創建好的實例
newInstance——返回一個新的實例

靜態工廠方法難道不就是工廠模式嗎?

講到這里,可能會有很多人覺得這不就是工廠模式嗎?答:并不完全相同。
本文講的靜態工廠方法,和工廠模式一樣,都是用來取代構造器的方法,都具有上面說的三個優勢:具名、環保、多子。

但是,兩者的實現方式和使用場景并不相同。

首先,直觀上看,在代碼結構上,我們說的工廠模式,通常需要一個xxxFactory類,在里面定義工廠方法;而本文講的靜態工廠

方法,則只需要一個類,類本身就提供了生產對象的工廠方法。

其次,我們想一下,假如一個類,在設計的時候,就提供了靜態工廠方法,那么還需要使用工廠模式嗎?

是的,不需要。

也就是說,只有當一個類沒有提供靜態工廠方法的時候,我們才需要使用工廠模式。

腦洞一下,假如蘋果公司有強大的零部件工廠,那它還需要富士康嗎?

總結

靜態工廠方法具有三大優勢——具名、環保、多子。

如果一個類提供了靜態工廠方法,那么也就不需要考慮對這個類進行工廠模式了。

我們在創建類時,切忌第一反應就是提供公有構造器,要優先考慮靜態工廠方法。

看完上述內容,你們對靜態工廠方法怎么在Java項目中實現有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

小金县| 石林| 嘉祥县| 康定县| 芦山县| 西充县| 萨迦县| 巢湖市| 藁城市| 临高县| 广饶县| 盐津县| 阜新市| 樟树市| 台南市| 苍山县| 曲水县| 潞城市| 桓台县| 龙南县| 简阳市| 崇左市| 阳西县| 聂拉木县| 安西县| 宣威市| 曲阳县| 安吉县| 明溪县| 汾阳市| 崇礼县| 永仁县| 眉山市| 柘荣县| 比如县| 连城县| 独山县| 肃宁县| 巨野县| 晴隆县| 天镇县|