创建销毁对象之遇到多个构造器参数时考虑用构建器(笔记)

本文探讨了Java中对象创建的不同模式,包括构造器模式的局限性和JavaBeans模式的问题。重点介绍了Builder模式如何结合两者优点,提供一种既灵活又易于使用的对象构建方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

讨论演进

1.多个构造器,构造器的参数列表越来越长

缺点:客户端代码很难编写,并且比较难以阅读

2.javaBeans模式

做法:使用无参构造器来创建对象,然后使用setter方法来设置每个必要参数。利于可读性

缺点:将一个构造过程分到几个调用中,在构造过程中JavaBean可能处于不一致状态

3.Builder模式

1和2的综合。

参考代码(来源于effective java中文版第11页):Builder类为NutritionFacts类的静态成员类

public class NutritionFacts {

	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;

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

		private int calories = 0;
		private int fat = 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 NutritionFacts build() {
			return new NutritionFacts(this);
		}
	}

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


备注:

Java 类中的静态成员类和非静态成员类的访问方式

非静态成员类:

public class TestNonstaticMember {
  class A{
    public void setA(){ }
       }
 
    public staticvoid main(String[] args){
        TestNonstaticMembernonStatic=new TestNonstaticMember();
        TestNonstaticMember.A t=nonStatic.new A();
           t.setA();
    }
 }

静态成员类:
调用静态内部类的非静态方法:

public class TestStaticMember{
   static class A{
      public void setA(){ }
    }
 }
 
public class Test2 {
    public static void main(String[] args){
        TestStaticMember.A a=new TestStaticMember.A();
        a.setA();
    }
}

调用静态内部类的静态方法:
public class TestStaticMember{
    static class A{
        static public void setA(){ }
        }
}
 
public class Test2 {
    public static void main(String[] args){
        TestStaticMember.A.setA();
    }
}

总结:

内部类和静态修饰符static
1)首先,用内部类是因为内部类与所在外部类有一定的关系,通常只有该外部类打算调用此内部类。
所以没有必要专门用一个Java文件存放这个类。
2)静态都是用来修饰类的内部成员的。
比如静态方法,静态成员变量,静态常量。
它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值