cari
RumahJavajavaTutorialJava中关于静态工厂方法的使用详解

Java中关于静态工厂方法的使用详解

Sep 09, 2017 pm 01:11 PM
javakilangkaedah

这篇文章主要介绍了 Java静态工厂方法的实例详解的相关资料,希望通过本文大家能掌握java今天工厂方法,需要的朋友可以参考下

 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类,在里面定义工厂方法;而本文讲的静态工厂

方法,则只需要一个类,类本身就提供了生产对象的工厂方法。

其次,我们想一下,假如一个类,在设计的时候,就提供了静态工厂方法,那么还需要使用工厂模式吗?

是的,不需要。

也就是说,只有当一个类没有提供静态工厂方法的时候,我们才需要使用工厂模式。

脑洞一下,假如苹果公司有强大的零部件工厂,那它还需要富士康吗?

总结

静态工厂方法具有三大优势——具名、环保、多子。

如果一个类提供了静态工厂方法,那么也就不需要考虑对这个类进行工厂模式了。

我们在创建类时,切忌第一反应就是提供公有构造器,要优先考虑静态工厂方法。

Atas ialah kandungan terperinci Java中关于静态工厂方法的使用详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)