`

java对象的创建建议

    博客分类:
  • java
阅读更多

1.1 考虑用静态工厂方法代替构造器

示例:

public static Boolean valueOf()boolean b {
return b ? Boolean.TRUE : Boolean.FALSE;
}

 

静态工厂方法的优势:

1、相对于构造器,静态工厂方法有名称。

例如:构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果用名为BigInteger.probablePrime的静态工厂方法来表示,显然更为清楚。(1.4的发行版本增加了这个方法)

 

2.静态工厂方法不必在每次调用它们的时候都创建一个新对象

静态工厂方法可以返回预先构建好的实例,将对象重复利用。

 

3、静态工厂方法可以返回原返回类型的任何子类型的对象

例如:Collections类可以返回不可修改的集合,同步集合等。

 

4、静态工厂方法在创建参数化类型实例的时候,可以使得代码变得更加简洁

例如:Map<String, List<Stirng>> m = new HashMap<String, List<Stirng>>();

如果HashMap提供了这个静态方法:

public static <K, V> HashMap<K, V> newInstance() {

return new HashMap<K, V>();

}

则可以这样声明:

Map<String, List<Stirng>> m = HashMap.newInstance();

 

静态工厂方法的惯用名称:

valueOf

of

getInstance

newInstance

getType

newType

 

 

1.2 遇到多个构造器参数时考虑使用构建器

静态工厂方法和构造器的共用局限性:它们都不能很好地扩展到大量的可选参数。

 

构建器实例:

public class NutritionFacts {
	 private final int servingSize;
	 private final int servings;
	 private final int calories;
	 private final int fat;
	 private final int sodium;
	 private final int carbohydrate;
	 
	 public static class Builder {
		 private final int servingSize;
		 private final int servings;
		 
		 private int calories = 0;
		 private int fat = 0;
		 private int sodium = 0;
		 private int carbohydrate = 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 Builder sodium(int val) {
			 sodium = val;
			 return this;
		 }
		 
		 public Builder carbohydrate(int val) {
			 carbohydrate = 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;
		 sodium = builder.sodium;
		 carbohydrate = builder.carbohydrate;
	 }
	 
	 public static void main(String[] args) {
		 NutritionFacts n = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
	 }
}

 

 

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

实例:

public class UtilityClass {
        private UtilityClass() {
                throw new AssertionError();
        }
        ...
}

 

由于构造器是私有的,所以不可以在该类的外部访问它。AssertionError可以避免不小心在类的内部调用构造器。这种做法还会导致该类不能被子类化。

 

 

1.4 避免创建不必要的对象

实例:

下面这个类建立了一个模型:其中有个人,并且有一个isBabyBoomer方法,用来检验这个人是不是生于1946至1964年的人。

class Person {
	private final Date birthDate;
	
	public Person(Date birthDate) {
		this.birthDate = birthDate;
	}
	
	public boolean isBabyBoomer() {
		Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
		gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
		Date boomStrat = gmtCal.getTime();
		gmtCal.set(1956, Calendar.JANUARY, 1, 0, 0, 0);
		Date boomEnd = gmtCal.getTime();
		
		return birthDate.compareTo(boomStrat) >= 0 && birthDate.compareTo(boomEnd) < 0;
	}
}

 

isBabyBoomer每次被调用的时候,都会创建一个Calendar,一个TimeZone,两个Date,这种情况完全是可以避免的。

 

改进后的类:

public class Person {
	private final Date birthDate;

	public Person(Date birthDate) {
		this.birthDate = birthDate;
	}

	private static final Date BOOM_START;
	private static final Date BOOM_END;
	static {
		Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
		gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
		BOOM_START = gmtCal.getTime();
		gmtCal.set(1956, Calendar.JANUARY, 1, 0, 0, 0);
		BOOM_END = gmtCal.getTime();
	}

	public boolean isBabyBoomer() {
		return birthDate.compareTo(BOOM_START) >= 0
				&& birthDate.compareTo(BOOM_END) < 0;
	}
}

 

改进后的Person类只在初始化的时候创建Calendar,TimeZone和Date。

分享到:
评论

相关推荐

    java 创建普通窗口

    一旦创建了`JFrame`对象,我们就可以调用其方法来设置窗口的各种属性,如大小、标题、可见性等。 ```java // 设置窗口大小 Window_Frist.setSize(500, 800); // 设置窗口标题 Window_Frist.setTitle("FirstWindow...

    使用json-lib将java对象转换成json字符串

    - 在实际开发中,为了保证代码的可读性和可维护性,建议在转换前先对Java对象进行数据校验。 - 使用Gson或Jackson等更现代的库,它们提供了更强大和灵活的JSON处理功能,性能也更好。 - 对于大型项目,考虑使用...

    java中创建对象的步骤有哪些.txt

    本文将深入探讨在Java中创建对象的具体步骤,并详细解释每个步骤的意义与实践方法。 ### 定义类(Class) 类是Java中的基本概念之一,可以将其视为对象的模板或者蓝图。一个类定义了该类的所有对象共有的特征...

    Java面向对象程序设计

    例如,你可能会遇到创建类、对象实例化、访问控制修饰符(public、private、protected和默认)、构造函数、方法重载和重写、接口、抽象类、集合框架(如ArrayList和LinkedList)等实际编程示例。通过这些实例,你...

    java 面向对象面试题

    Java允许定义有参数的构造器,以便在创建对象时传递初始值。 8. **访问控制修饰符有哪些?** Java有四种访问控制修饰符:`public`(公共)、`protected`(受保护)、`default`(默认,包内可见)、`private`(私有...

    深入Java对象及元素的存储区域

    ### 深入Java对象及元素的存储区域 在Java平台进行软件开发的过程中,一个显著的特点是对象的创建是在程序运行时动态发生的。这也就意味着,直到程序执行时才能最终确定对象应该存放在哪个内存区域。不同的存储区域...

    Java面向对象程序设计课本例题源代码

    Java面向对象程序设计是计算机科学领域中一门重要的编程语言课程,尤其在软件开发中占据着核心地位。清华大学的耿祥义教授编写的教材是许多学习者深入理解Java面向对象编程的首选资料。这个压缩包中包含的就是这本...

    Java面向对象编程培训讲义(ppt格式)

    Java面向对象编程是Java语言的核心特性,它使得代码更加模块化、可维护和易于扩展。孙卫琴老师的Java编程培训讲义深入浅出地讲解了这一主题,旨在帮助学习者理解并掌握面向对象编程的基本概念和实践技巧。 首先,...

    java实现面向对象

    面向对象编程(Object-Oriented Programming,简称OOP)是Java语言的核心特性,它通过模拟现实世界中的对象和类来组织代码,使程序设计更加结构化、模块化和易于维护。下面将详细介绍Java中面向对象的基本概念、核心...

    JAVA基础-面向对象课程笔记

    ### JAVA基础-面向对象课程笔记 #### 面向过程与面向对象对比 **面向过程**是一种编程思想,它的核心是“做什么事”的步骤。例如,处理“把大象放进冰箱”这个问题时,按照面向过程的思路,我们会将其分解为三个...

    Java零基础-对象的创建和使用-内存分析.md

    对象创建的两个主要步骤包括分配内存和初始化对象。 1. **分配内存**:当使用`new`关键字时,Java虚拟机会为新对象分配内存空间。 2. **初始化对象**:分配完内存后,会根据类的构造函数来初始化对象的状态。 示例...

    JAVA创建和销毁对象的方法

    最后,单例模式是一种特殊的对象创建模式,它保证一个类只有一个实例。单例可以通过私有构造器和静态工厂方法实现,或者使用枚举类型。使用枚举类型实现单例可以确保线程安全且防止反射攻击,是推荐的实现方式: ``...

    JAVA面向对象编程(孙卫琴)08.pdf

    根据提供的文件信息,我们可以从中提取以下知识点: ...为了更深入地学习Java面向对象编程,建议读者阅读孙卫琴老师的书籍,结合实例和练习,不断实践和思考,从而真正掌握面向对象的开发思想和方法。

    java面向对象的设计

    在Java这样的面向对象语言中,遵循一些设计原则可以显著提高代码的质量和可维护性。以下是几个重要的面向对象设计原则的详细解释: 1. **开闭原则(Open-Closed Principle, OCP)** 开闭原则指出,软件实体(如类...

    JAVA 创建Shape文件。并在文件中添加一条折线

    在Java编程中,创建Shape文件并添加折线是一项常见的任务,尤其在图形用户界面(GUI)开发或GIS(地理信息系统)应用中。这篇博客“JAVA 创建Shape文件。并在文件中添加一条折线”可能详细解释了如何实现这个过程。...

    44条Java代码优化建议

    在这44条Java代码优化建议中,我们可以提炼出一些核心的知识点,为Java编程实践提供参考。 首先,关于为什么要进行代码优化,作者提出了优化不仅仅是为了提升运行效率,更重要的是为了减少错误的发生。在现代的...

    Java-Java面向对象编程教程

    面向对象编程(Object-Oriented Programming,简称OOP)是Java的核心理念,它允许开发者通过创建和操作对象来设计复杂的软件系统。本Java面向对象编程教程将深入探讨这一关键概念。 在Java中,面向对象编程主要包括...

    JAVA面向对象编程 孙卫勤

    - 构造器(Constructor):用于初始化新创建对象的特殊方法。 - 类的访问控制:了解public, protected, private和默认访问修饰符的使用。 - 接口(Interface):Java中的纯抽象类,用于实现多继承。 - 内部类(Inner...

Global site tag (gtag.js) - Google Analytics