Java Builder 模式,你搞明白了么?
例子
1 public class Outer { 2 private String name; 3 private int age; 4 5 public static class Builder { 6 private String name; 7 private int age; 8 9 public Builder() {} // 可以不写,编译器会为它生成默认构造方法 10 11 public Builder withName(String name) { // 链式调用,返回this 12 this.name = name; 13 return this; 14 } 15 16 public Builder withAge(int age) { // 链式调用,返回this 17 this.age = age; 18 return this; 19 } 20 21 public Outer build() { 22 return new Outer(this); 23 } 24 } 25 26 private Outer(Builder b) { 27 this.age = b.age; 28 this.name = b.name; 29 } 30 }
使用:
1 Outer outer = new Outer.Builder() // 创建(实例化)内部静态类Builder,才能调用Builder类中的实例方法withName等 2 .withName("名字哦") 3 .withAge(7) 4 .build();
- 链式调用风格方便构建复杂对象:在使用
Builder
模式时,设置各个属性的方法返回当前Builder
对象本身,这使得可以采用链式调用的方式来构建复杂对象(特别是参数较多时,容易出现参数顺序混淆等问题),代码更加简洁易读(无需写一堆构造器)。
静态类
https://www.cnblogs.com/Alex--Yang/p/3386863.html
在Java世界里,经常被提到静态这个概念,static作为静态成员变量和成员函数的修饰符,意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见。最近一个项目里频繁用到static修饰的内部类,再读了一下《Effective Java》才明白为什么会用static来修饰一个内部类也就是本文的中心——静态类。
如果一个类要被声明为static的,只有一种情况,就是静态内部类。如果在外部类声明为static,程序会编译都不会过。在一番调查后个人总结出了3点关于内部类和静态内部类(俗称:内嵌类)
1.静态内部类跟静态方法一样,只能访问静态的成员变量和方法,不能访问非静态的方法和属性,但是普通内部类可以访问任意外部类的成员变量和方法
2.静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。
3.静态内部类可以单独初始化:
Inner i = new Outer.Inner();
普通内部类初始化:
Outer o = new Outer(); Inner i = o.new Inner();
静态内部类使用场景一般是当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建的时候会考虑采用静态内部类的设计。如上的Builder设计模式例子。
对于静态类总结是:1.如果类的构造器或静态工厂中有多个参数,设计这样类时,最好使用Builder模式,特别是当大多数参数都是可选的时候。
2.如果现在不能确定参数的个数,最好一开始就使用构建器即Builder模式。
其它
https://zhuanlan.zhihu.com/p/80910560
1 public class Student { 2 3 private String name; 4 5 private int age; 6 7 private int num; 8 9 private String email; 10 11 // 提供一个静态builder方法 12 public static Student.Builder builder() { 13 return new Student.Builder(); 14 } 15 // 外部调用builder类的属性接口进行设值。 16 public static class Builder{ 17 private String name; 18 19 private int age; 20 21 private int num; 22 23 private String email; 24 25 public Builder name(String name) { 26 this.name = name; 27 return this; 28 } 29 30 public Builder age(int age) { 31 this.age = age; 32 return this; 33 } 34 35 public Builder num(int num) { 36 this.num = num; 37 return this; 38 } 39 40 public Builder email(String email) { 41 this.email = email; 42 return this; 43 } 44 45 public Student build() { 46 // 将builder对象传入到学生构造函数 47 return new Student(this); 48 } 49 } 50 // 私有化构造器 51 private Student(Builder builder) { 52 name = builder.name; 53 age = builder.age; 54 num = builder.num; 55 email = builder.email; 56 } 57 58 @Override 59 public String toString() { 60 return "Student{" + 61 "name='" + name + '\'' + 62 ", age=" + age + 63 ", num=" + num + 64 ", email='" + email + '\'' + 65 '}'; 66 } 67 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏