Effective Java 第2章: 创建和销毁对象

本文深入探讨了Java设计模式中的三大关键主题:静态工厂方法、构造器Builder模式以及Singleton模式的实现方式。首先,介绍了静态工厂方法的优点,如提供命名、避免重复创建对象等,并对比了其与构造器的差异。其次,讲解了构造器Builder模式如何解决多参数构造器的问题,提高了代码的清晰性和可读性。最后,讨论了通过私有构造器和枚举类型强化Singleton模式的方法,确保了Singleton的正确性和线程安全性。

一、用静态工厂方法代替构造器

静态工厂方法与构造器相比有以下几个优点:
  • 静态工厂方法有名称;
  • 不必每次调用的时候都创建新的对象;
  • 可以返回原返回类型的任何子类型的对象;
  • 在创建参数化类型实例的时候没,静态工厂方法使得代码变得更加简洁;
缺点:
  • 类如果不含有公有的或者受保护的构造器,就不能被子类化;
  • 静态工厂方法与其他的静态方法实际上并没有任何区别;
静态工厂方法常用的名称:
  • valueOf:一般用作类型转换方法;
  • of:valueOf更简洁的代替,在EnumSet中使用病流行起来;
  • getInstance:用于返回实例;
  • newInstance:返回的实例与其他的所有实例都不同;
  • getType:和newInstance类似;
代码:https://github.com/yanzxu/EffectiveJava/tree/master/src/main/java/chapter1/staticfactory
public class Services {
    private Services() {
    }

    private static final Map<String, Provider> providers = new ConcurrentHashMap<>();

    private static final String DEFAULT_PROVIDER_NAME = "test";

    public static void registerDefaultProvider(Provider provider) {
        registerProvider(DEFAULT_PROVIDER_NAME, provider);
    }

    public static void registerProvider(String name, Provider prodiver) {
        providers.put(name,prodiver);
    }

    public static Service newInstance() {
        return newInstance(DEFAULT_PROVIDER_NAME);

    }

    public static Service newInstance(String name){
        Provider p = providers.get(name);

        if (p == null) throw new IllegalArgumentException("No provider registered with name: " + name);

        return p.newService();
    }
}

二、遇到多个构造器参数时考虑用构造器Builder模式

情景

对于多参构造器,其中一些参数是必须的而另一些则是可选的,这样的话我们在创建类的时候就要创建多个含有不同参数的构造器,不仅笨重而且不易区分不同的构造器,针对这种情况我们就可以采用Builder模式来替代多参构造器,如下所示。

代码 https://github.com/yanzxu/EffectiveJava/tree/master/src/main/java/chapter1/builder
public class Person {

    private String name;
    private boolean gender;
    private int age;
    private String address;
    private Date birthday;

    private Person(Builder builder){
        this.name = builder.name;
        this.gender = builder.gender;
        this.age = builder.age;
        this.address = builder.address;
        this.birthday= builder.birthday;
    }


    public static class Builder {
        // required parameters
        private String name;
        private boolean gender;

        // optional parameters: initialized to default values
        private int age = 0;
        private String address = "China";
        private Date birthday = new Date();

        public Builder(String name, boolean gender) {
            this.name = name;
            this.gender = gender;
        }

        public Builder age(int age) {
            this.age= age;
            return this;
        }

        public Builder address(String address) {
            this.address= address;
            return this;
        }

        public Builder birthday(Date birthday) {
            this.birthday= birthday;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
}
创建对象

此时创建对象只需要传入必选参数就可以了。

new Person.Builder("Eric", true)
                .age(22)
                .address("Beijing")
                .build();

三、通过私有构造器或者枚举类型强化Singleton属性

四、通过私有构造器强化不可实例化的能力

五、避免创建不必要的对象

六、消除过期的对象引用

七、避免使用终结方法

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值