第二章 创建和销毁对象(上)

第二章 创建和销毁对象

第1条 考虑用静态方法工厂代替构造器

  1. 解释:静态方法工厂指的是用静态的方法提供类的对象,与工厂方法模式不同
  2. 优势:
    1. 有名称,既然是方法就比构造方法多出了有意义的名称,可读性更好。
    2. 不必在每次调用的时候创建一个新的对象。
      • 增加了复用性,提升性能。
      • 有助于严格控制在哪个时刻哪些实例应该存在(实例受控类)
      • 不可变类不会存在两个相等的实例。(当且仅当a=b时,a.equals(b)为true)例,枚举(暂时看不懂。)
    3. 可以返回原返回类型的任何子类型的对象
      • 可以返回对象,同时不会让对象的类变为公有。
      • 静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不必存在;(服务提供者框架)
    4. 在创建参数化类型的实例的时候,使代码变得更加简洁(参数推导)
  3. 缺点
    1. 类如果不含公有或者守保护的构造器,就不能被子类化
    2. 与其他的静态方法实际上没有任何区别(没有在API明确标识)

第2条 遇到多个构造器参数时要考虑用构造器

多参数的构造器有三种方式:

  1. 重叠构造器:有几个参数就写几个参数的构造器
    • 有许多参数时,代码难编写难阅读
  2. JavaBeans模式-空参数的构造方法,用set为其设置参数
    • 参数的设置分到了几个调用中,可能处于不一致的状态
    • 阻止了类做成不可变的可能
  3. Builder模式(中间的泛型部分看不懂,在26节后记得看
    • 模拟了具名的可选参数
    • 更安全(相比于此,newIntance会破坏编译时的异常检查)
    • 缺点:Builder本身的构建会浪费内存。所以只在多参数时使用

    public class NutritionFacts {
        private final int servingSize;
        private final int servings;
        private final int calories;
        private final int fat;
        private final int sodium;
        private final int carbohydrate;

        public static class Builder {
            // Required parameters
            private final int servingSize;
            private final int servings;

            // Optional parameters - initialized to default values
            private int calories  = 0;
            private int fat   = 0;
            private int carbohydrate  = 0;
            private int sodium= 0;

            public Builder(int servingSize, int servings) {
                this.servingSize = servingSize;
                this.servings= servings;
            }

            public Builder calories(int val)
            { calories = val;  return this; }
            public Builder fat(int val)
            { fat = val;   return this; }
            public Builder carbohydrate(int val)
            { carbohydrate = val;  return this; }
            public Builder sodium(int val)
            { sodium = val;return this; }

            public NutritionFacts build() {
                return new NutritionFacts(this);
            }
        }

        private NutritionFacts(Builder builder) {
            servingSize  = builder.servingSize;
            servings = builder.servings;
            calories = builder.calories;
            fat  = builder.fat;
            sodium   = builder.sodium;
            carbohydrate = builder.carbohydrate;
        }

        public static void main(String[] args) {
            NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
            calories(100).sodium(35).carbohydrate(27).build();
        }
    }

第3条 用私有构造器或者枚举类型强化Singleton属性

解释:Singleton指仅仅被实例化一次的类。

特性:会使客户端测试变得十分困难(不懂)

三种方法:

  1. final公有静态成员(没有优势,不能防止反射攻击)
  2. 公有静态工厂方法(提供了灵活性,便于控制,不能防止反射攻击)

    • 为了使Singleton类变为可序列化(Serializable)的(11章后复习),仅声明implements Serializable是不够的。为了维护Singleton,必须声明实例field是瞬时的,提供readResolve.否则在反序列化时会生成新的对象。(不懂,77条时复习)
      private Object readResolve(){
      return INSTANCE;
      }
  3. 单元素枚举类型

    • 提供了序列化机制
    • 绝对防止多次实例化,防止放射攻击,最佳方式

      public enum Elvis{
          INSTANCE;
          public void method(){...}
      }
      

第4条 通过私有构造器强化不可实例化的能力

场景:类中只包含静态方法或者静态field

原因:类中默认含有一个默认构造器。假如没有显式的构造器,那么这个构造器在API中还是可以看到。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值