gpt4 book ai didi

Java静态工厂方法的实例详解

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Java静态工厂方法的实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

 Java静态工厂方法的实例详解 。

什么是静态工厂方法 。

对于类而言,为了让使用者获取它自身的一个实例,最常用的方法就是提供一个公有的构造器。 当然,这里要介绍的是另一种方法——静态工厂方法,一个返回类的实例的静态方法。 举个例子,Boolean的一个将基本类型boolean转为封装类的方法,valueOf:

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

为什么要使用静态工厂方法 。

那么,我们为什么要使用静态工厂方法,而不是使用构造器呢?

因为静态工厂方法,具有以下三个特点——具名、环保、多子,下面一个个来讲.

> 具名  静态工厂方法有名称 。

对于构造器来说,根据入参的不同可以有多个构造器,但是这些构造器的名称都是一样的,使用者在调用时就会一头雾水,到底应该调用哪一个呢.

而使用了静态工厂方法之后,你可以根据方法的功能给方法起不同的名字,只有名字起得好,使用者看到方法名就知道是什么意思,知道这时候应该调用哪一个方法,大大提高了代码的可读性.

> 环保  不必每次调用的时候都创建一个新对象 。

使用构造器,每次都会产生一个新的对象.

而静态工厂方法,可以重复地返回预先创建好的对象.

上面Boolean就是一个非常好的例子,TRUE和FALSE两个变量都是预先创建好的,而且都是不可变的final对象,谁需要用到了,就给它返回过去,也不用担心被修改了.

下面就是TRUE和FALSE两个变量的初始化代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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方法为例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
  * 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类,在里面定义工厂方法;而本文讲的静态工厂 。

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

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

是的,不需要.

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

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

总结 。

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

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

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

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。

原文链接:http://blog.csdn.net/hzy38324/article/details/72630415 。

最后此篇关于Java静态工厂方法的实例详解的文章就讲到这里了,如果你想了解更多关于Java静态工厂方法的实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com