第五条:避免创建不必要的对象
1, 有个一典型的例子
String s=new String(“a”);
这个语句每次都都创建一个新的string实例。但是这没有必要。你可以这么写。
String s=”a”;
这样就避免了创建一个新的string实例。
2, 对于同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方法而不是构造器,以避免创建不必要的对象。构造器在每次调用的时候都会创建一个新的对象,而静态工厂方法则从来不要求这么做,实际上也不会这样做。
3, 请使用static方法和static变量来表示定值的数据,这样可以有效的避免重复创建定值的对象。
4, 如果在一个类中,需要使用静态方法实例的方法,并没有使用静态方法,那么你可以考虑延迟初始化(lazily initializing),但是这么做会让实现复杂化,也会影响性能。
5, 我们讨论不创建重复对象,显然这个对象是不可变的,是可以重用的。但是有些情况并不这么明显。例如适配器(adapter)的情形,有时也叫做视图(view),适配器就是指这样一个对象:它把功能委托给一个后备对象(backing object),从而为后备对象提供一个可以替代的接口。由于适配器除了后被对象之外,没有其他的状态信息,所以针对某个给定对象的特定适配器而言,它不需要创建多个适配器实例。
例如,Map接口的keySet方法返回该Map对象的Set视图,其中包含该Map中的所有键(key),好像每次调用keySet都应该创建一个新的Set实例,但是对于一个给定的Map对象,实际上每次调用keySet都返回同样的Set实例。因为他们由同一个Map实例支撑。
6, 在jdk1.5中,有一个创建多余对象的新方法,叫做自动装箱(autoboxing),注意,要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。
7, 对于小对象的创建,其代价是很廉价的。
8, 重用对象需要付出的代价要远远大于因创建重复对象而付出的代价,必要时如果没能实施保护性拷贝,将会导致潜在的错误和安全漏洞,而不必要的创建对象则只会影响程序的风格和性能。
分享到:
相关推荐
6. **避免不必要的对象创建**:对象创建有开销,所以应该尽可能减少不必要的对象,例如使用`String`常量池,避免使用`new`关键字。 7. **终结方法与清理器**:Java中的`finalize`方法往往不推荐使用,因为它不能保证...
总结来说,静态工厂方法在Java中提供了一种比构造方法更加灵活和高效的方式来创建对象实例,特别是在需要实例控制、性能优化或API设计简洁时。文档《effective-java.pdf》详细地探讨了静态工厂方法在设计和实现上的...
11. **优先使用Arrays.asList()而不是new ArrayList()**:前者将数组转换为列表,而后者创建了一个新的列表,前者更高效且避免了创建不必要的对象。 12. **使用迭代器而非for-each循环遍历集合**:两者都能遍历集合...
- **避免在循环体中创建对象**:循环内的对象创建可能会导致不必要的性能开销。 - **了解JVM内存模型**:理解堆、栈、方法区等概念,有助于进行性能调优。 - **使用StringBuilder(或StringBuffer)**:在构建...
- **避免对对象的不必要的复制**:了解如何最小化对象复制,例如通过使用`System.arraycopy()`或`Arrays.copyOf()`。 - **正确使用equals()和hashCode()**:理解这两者的性能影响,特别是在集合类中。 9. **最后...
避免不必要的对象创建 德玛 项目7 释放使用的对象参考 莉娜 项目8 避免使用终结剂和清洁剂 莉娜 项目9 使用try-with-resources而不是try-finally 林 第三章所有对象的通用方法 项目编号 标题 副标题 经理 项目...
- **项02:避免创建不必要的对象**:过度创建对象会增加内存负担,应该尽可能重用现有对象或采用更高效的替代方案。 - **项03:覆盖equals时请遵守通用约定**:正确的equals方法实现对于确保对象一致性至关重要。 #...
21. 避免创建不必要的对象。 22. 使用System.arraycopy()方法复制数组。 23. 对于可序列化类,明确指定serialVersionUID。 以上就是基于“Java学习总结(2023/03/19)”的主题,结合《Effective Java》一书,对Java...
饿汉式在类加载时就完成了实例化,确保了线程安全,但可能会造成不必要的内存浪费。`SingleInstance2.java`可能就使用了这种模式。代码中单例对象在类加载时即被创建。 ```java public class SingleInstance2 { ...
- **条款9**:相等判断是C#编程中经常遇到的问题,正确的实现可以避免错误和不必要的性能损失。 - **条款27**:`ICloneable`接口的使用需要谨慎,因为它可能导致复制性能问题和内存泄漏。 - **条款29**:`new`修饰符...
通过两次检查instance是否为null来避免不必要的同步。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if ...
单例模式是软件设计模式中的一种经典模式,它在Java、C++、Python等众多编程语言中被广泛应用...总的来说,理解并正确运用单例模式,可以有效提高代码的复用性和可维护性,但也要注意避免滥用,以免带来不必要的问题。
缺点:如果应用中单例并不需要,那么这个单例会占用不必要的内存资源。 2. 懒汉式(Synchronized Method) 这种实现方式在类加载时不创建实例,只有在第一次调用`getInstance`方法时才进行实例化,通过synchronized...
结合了懒汉式的延迟初始化和饿汉式的线程安全性,避免了不必要的同步开销。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static ...
但是,这种方式可能导致不必要的内存浪费,因为即使没有使用单例,也会在类加载时创建对象。 2. **懒汉式(线程不安全)** 懒汉式是在第一次调用`getInstance`方法时才创建单例。但这种方式在多线程环境下会有...
在Java、C#等面向对象语言中,单例模式被广泛应用,尤其是在需要频繁创建和销毁的对象,或者需要全局访问点的情况下。 ### 1. 懒汉模式(Lazy Initialization) 懒汉模式是在第一次需要使用单例时才进行实例化,...
5. **枚举**:这是Joshua Bloch在《Effective Java》中推荐的方法,既简单又安全。 ```java public enum Singleton { INSTANCE; } ``` 在【描述】中提到的"范例代码"可能包含了以上某种或多种实现方式。通过分析`...