一、优先考虑静态工厂方法代替构造方法
当一个类需要有多个构造方法时,可以考虑使用静态工厂方法来代替这些构造方法。
这样做的好处在于:
第一:静态工厂方法可以通过方法签名对所要创建的对象有一个较为清晰的描述,而构造方法不能做到
第二:静态工厂方法可以避免重复创建相同的对象(Boolean 示例可以说明)
第三:静态工厂 方法可以返回所要返回类型的任何子类(这一点在框架中尤其是API中非常有用)
第四:创建参数化实例时可以简化代码(HashMap 示例可以说明)
示例:
1、Boolean 示例:
publice static Boolean valueOf(boolean b){
return b ? Boolean.TRUE : Boolean.FALSE;
}
2、HashMap 示例:
如果想要构造这样的实例 :
Map<String, List<String>> map = new HashMap<String, List<String>> ();
通过构造方法来实现就很麻烦,但是通过静态工厂方法就会相对简单。
publice static <K, V>Map<K, V> newInstance(){
return new HashMap<K, V>();
}
Map<String, List<String>> map = HashMap.newInstance();
二、使用Builder模式来处理多构造参数对象创建
1、当一个对象的构造参数有多个且大多都是可选时,应该考虑使用Builder模式。
2、当一个类创建好后,后续如果还要扩展成员变量,应该考虑使用Builder模式。
为什么不使用层叠构造器和静态工厂方法?
答:
层叠构造器过多对使用者来说并不是件友好的事,而且会带来一定的维护成本 。
静态工厂方法更适合参数少的构造对象。
示例 :
public classCat{
public static void main(String[] args) {
Cat cat = new CatBuilder().name("小花").sex('母').color("❀").weight(2.5).build();
System.out.println(cat.getColor());
}
private String color;
private Integer age;
private Character sex;
private String name;
private Double weight;
public static classCatBuilder{
private String color;
private Integer age;
private Character sex;
private String name;
private Double weight;
public CatBuilder color(String color) {
this.color = color;
return this;
}
public CatBuilder age(Integer age) throws Exception {
if (0 > age) throw new Exception("年龄输入错误");
this.age = age;
return this;
}
public CatBuilder sex(Character sex) {
this.sex = sex;
return this;
}
public CatBuilder name(String name) {
this.name = name;
return this;
}
public CatBuilder weight(Double weight) {
this.weight = weight;
return this;
}
public Cat build() {
Cat cat = new Cat();
cat.color = this.color;
cat.age = this.age;
cat.sex = this.sex;
cat.name = this.name;
cat.weight = this.weight;
return cat;
}
}
public String getColor() {
return color;
}
public Integer getAge() {
return age;
}
public Character getSex() {
return sex;
}
public String getName() {
return name;
}
public Double getWeight() {
return weight;
}
@Override
public String toString() {
return "Cat{" +
"color='" + color + '\'' +
", age=" + age +
", sex=" + sex +
", name='" + name + '\'' +
", weight=" + weight +
'}';
}
}
相关推荐
### Java对象创建过程详解 在Java编程语言中,对象是程序的基本单元,一切皆对象这一概念使得Java在面向对象编程领域具有重要的地位。本文将详细阐述Java对象的创建过程,帮助读者深入理解Java基础。 #### 一、类...
在本场景中,"JNI创建java对象"指的是利用JNI技术在C/C++原生代码中创建和操作Java对象。JNI在Android开发中尤其重要,因为Android系统的主要编程语言是Java,但为了实现高性能计算或调用操作系统底层功能,开发者...
7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和...
-java 创建对象的四种方法是指在 Java 中创建对象的不同方式,它们分别是使用 new 语句创建对象、使用反射机制创建对象、使用 clone() 方法创建对象和使用反序列化机制创建对象。 - 使用 new 语句创建对象是 Java ...
Java中创建对象主要有四种显式的方式,分别是使用new关键字、反射机制、克隆克隆方法...在实际开发中,选择合适的对象创建方式能够提高程序的效率和性能,同时也要注意对象创建过程中可能出现的内存泄漏和性能问题。
在实际开发中,了解对象创建和垃圾回收的原理可以帮助我们编写出更高效、资源利用率更高的代码。例如,避免创建大量短生命周期的对象(称为"对象抖动"),合理使用数据结构和集合类,以及适时调用`System.gc()`...
#### 一、Java对象、引用及创建过程 在Java中,对象是程序的基本单位,它包含了属性(成员变量)和行为(方法)。对象是由类创建出来的实例,而类则是一组具有相同属性和行为的对象的模板。 ##### 1. 对象创建与...
8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java...
使用POI,我们可以创建一个工作簿对象,然后遍历工作表,单元格等,读取数据并将其转化为Java对象。例如,如果Excel中的每一行代表一个用户对象,我们可以通过循环遍历行和列,构建User对象并填充属性。 对于CSV...
本文将详细探讨Java对象在JVM中的创建过程以及其内存布局,帮助读者更深入地理解Java对象是如何在内存中产生的。 #### 二、对象的创建 Java对象是由类实例化的结果,当我们使用`new`关键字创建一个对象时,实际上...
实验中,我们创建了两个`Monkey`对象`monkey1`和`monkey2`,并调用了它们的方法,展示了对象的使用。 成员变量和局部变量是Java中的两种变量类型。成员变量是类的一部分,可以在类的所有方法中访问;而局部变量只在...
Java 语言提供了三种基本的对象创建方法:使用 new 运算符、使用反射机制和使用工厂设计模式。使用 new 运算符是最基本的对象创建方法,格式为:<类名> <对象名> = new <类名>([<参数列表>]),其中参数列表是可选的...
- **对象创建**:通过`new`关键字实例化一个类的对象。 - **封装**:将数据和操作数据的方法封装在类中,实现信息隐藏。 - **构造器**:用于初始化新创建对象的特殊方法。 5. **第5章:继承与接口** - **继承**...
在Java编程中,将Java对象转换为XML数据是一项常见的任务,特别是在处理数据交换或存储时。JAXB(Java Architecture for XML Binding)是Java提供的一种标准API,它允许开发者轻松地在Java对象和XML文档之间进行映射...
总结来说,Java对象池是一种优化技术,通过复用对象减少创建和销毁的成本。我们可以借鉴Jakarta Commons Pool的设计思路,实现自己的轻量级对象池,满足特定场景的需求。理解并熟练运用对象池,对于提升Java应用的...
1. **JAXB反序列化**:与序列化相反,你可以使用`Unmarshaller`从XML字符串或文件创建Java对象。`Unmarshaller`对象的`unmarshal()`方法会返回一个与XML对应的Java对象。 2. **DOM解析**:解析XML文件得到DOM树,...
1. **配置映射**: 使用Betwixt,你需要创建一个`BeanIntrospector`实例,并通过`introduceBean()`方法指定XML与Java对象的映射规则。通常,Betwixt会尝试基于Java类的公共字段和方法自动建立映射,但也可以通过注解...
1. **创建对象**: `new Student()` 在堆内存中创建了一个新的 `Student` 对象。 2. **调用构造函数**: 紧接着,调用 `Student` 类的构造函数对该对象进行初始化。 3. **创建引用**: `Student stu` 创建了一个类型为 ...
1. **私有构造器(Private Constructor)**:这是最常用的控制对象创建的方式,特别是用于实现单例模式。通过将类的构造器声明为私有,外部类无法直接实例化它。例如: ```java public class Singleton { private ...