Effective java参透

本博客,教给你如何避免一些java错误,如何处理一些java错误。

第一章、创建和销毁对象:

  • 第1条 考虑用静态工厂方式代替构造器:(?)
    1> 与构造器的不同的优势所在:
    (1)它们有名称。
    (2)不必在每次调用它们时都创建一个新对象。
    (3)它们可以返回类型的任何子类型的对象。
  • 第2条 遇到多个构造器参数时考虑用构建器:
    方法:把需要用的参数包装在这个类的一个成员类中,创一个给它们赋值的方法,但返回的是本类对象,最后一个方法是传入此对象,返回的是外部类对象。
    优势:可以有多个可变参数。
    范例:
/**
Builder模式:当构造器需要传入多个参数,且并不确定传几个时,可以使用Builder模式:
1.范例:模拟食品中营养成分构建

*/


public class NutritionFacts{  //营养类,需要一个可以传入多个参数的构造器
    //1私有的静态属性颜色,大小等
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    public int getfat(){
        return fat;
    }
    private final int sodium;
    private final int carbohydrate;

    //2静态的成员类
    public static class Builder{
        /*必须用到的参数
        */
        private final int servingSize;
        private final int servings;
        /*可选的参数,并赋值初始化(注:不能用final了)
        */
        private int calories = 0;
        private int fat  = 0;
        private int carbohydrate = 0;
        private int sodium = 0;
        //Builder的构造器
        public Builder(int servingSize,int servings ){
            this.servingSize = servingSize;
            this.servings =servings;

        }

        //其他参数通过方法来一一获得
        public Builder calories(int val){
            this.calories = val;
            return this;
        }
        public Builder fat(int val){
            this.fat = val;
            return this;
        }
        public Builder carbohydrate(int val){
            this.carbohydrate = val;
            return this;
        }
        public Builder sodium(int val){
            this.sodium = val;
            return this;
        }

        //实例一个NutritionFacts对象,参数传入builder
        public NutritionFacts build(){
            return new NutritionFacts(this);
        }

    }
    //外部类的构造器,参数是builder类型
    private NutritionFacts(Builder builder){
        //将外部类中的参数赋值,将builder中的参数赋给它
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        carbohydrate = builder.carbohydrate;
        sodium = builder.sodium;


    }
}
//客户端测试:
public class TestFactory 
{
    public static void main(String[] args) 
    {
        /*创建NutritionFacts对象,用到静态类Builder,且里面有必传的两个参数,其他参数可通过方法任意选择是否传入,且最后一定要.build方法。
        .builder的作用就是又返回到生成一个NutritionFacts对象,
        */
        NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).calories(100).sodium(35).carbohydrate(27).fat(16).build();
        System.out.println(cocaCola.getfat());


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值