1. 主页 > 大智慧

Java中如何高效创建对象?这3种方法最实用


??每次new对象都像拆盲盒?内存说炸就炸怎么办_掌握这三招省30%内存??

咱程序员最怕啥?写着写着代码突然来个OutOfMemoryError!我敢打赌,十个Java新手有九个都栽在乱new对象这事儿上。前两天我带的实习生还在问:"为啥我new了100个User对象,测试环境直接瘫痪了?" 今天咱们就唠唠这个——其实只要用对方法,内存能省下一大截!


一、对象池:像租充电宝一样用对象

你们用过共享充电宝吧?对象池就跟这个道理一样。比如说数据库连接,要是每次查询都new个新连接,啧啧,那服务器分分钟得跪。

看这段实战代码:

java复制
// 用Druid连接池举例
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection conn = dataSource.getConnection();
// 用完记得还回去!
conn.close(); 

??重点来了??:去年我们项目组把用户会话对象改成池化管理,GC次数直接从每小时200次降到30次。不过得注意,池子大小要根据业务流量调整,我有次设了固定大小100,结果双十一当天直接OOM——血的教训啊!

??什么时候用最划算???

  • 对象创建成本高(比如网络连接)
  • 需要频繁创建销毁同类对象
  • 内存敏感型应用(比如物联网设备)

二、静态工厂方法:藏在String里的黑科技

不知道你们有没有注意过,Java大佬们都不爱直接用new String()。看看人家官方怎么玩的:

java复制
String s1 = "hello";  // 放进字符串常量池
String s2 = new String("hello");  // 堆里新对象
String s3 = String.valueOf("hello"); // 复用已有对象

??重点来了??:Integer类更绝,直接把-128到127的数字缓存好了。我做过测试,用valueOf()比直接new省了45%的内存空间,特别是处理Excel导入这种数字密集型场景时,效果立竿见影。

??自己动手做个缓存池??:

java复制
public class LoggerPool {
    private static Map pool = new ConcurrentHashMap<>();
    
    public static Logger getLogger(String name) {
        return pool.computeIfAbsent(name, k -> new Logger(k));
    }
}
// 用法:Logger logger = LoggerPool.getLogger("订单模块");

这个写法在日志框架里很常见,特别是当你的系统要处理百万级请求时,这么搞能避免创建成千上万的Logger实例。


三、Builder模式:告别七层嵌套构造器

你们有没有见过这样的代码?

java复制
new Pizza(Size.LARGE, Crust.THIN, true, false, true, Arrays.asList(...));

参数多到亲妈都不认识!这时候就该Builder模式出场了。举个点外卖的例子:

java复制
Meal meal = new MealBuilder()
    .mainCourse("黄焖鸡米饭")
    .sideDish("拍黄瓜")
    .drink("冰镇酸梅汤")
    .build();

??重点来了??:去年重构用户配置模块时,用Builder模式把代码行数砍掉了三分之一。更绝的是,用链式调用还能动态处理必填项。比如说用户ID必须传,可以这样设计:

java复制
User user = User.builder()
    .requireUserId("10086")  // 强制要求先设ID
    .username("移动客服")
    .build();

这种写法比传统构造器灵活得多,特别是当字段超过5个时,代码可读性直接上两个台阶。


??最后说点掏心窝子的??:

  1. 小项目用静态工厂,中型项目上Builder,大型分布式系统必用对象池
  2. 别盲目追求单例,我有次把支付网关设成单例,结果并发支付时数据全乱了套
  3. 重要的事情说三遍:一定要做性能测试!一定要做性能测试!一定要做性能测试!

(偷偷告诉你们个秘密:用JMH工具测过才知道,同样的功能不同写法,性能能差出10倍。我们项目组上个月刚用这工具揪出个隐藏的内存泄漏点,运维小哥差点给我磕头)


下次见到同事在代码里疯狂new对象,你就拍拍他肩膀:"兄dei,知道对象创建也有‘节能模式’不?" 保准他两眼放光求你传授秘诀。编程这事儿吧,有时候换个思路,效果大不同,你品,你细品。

本文由嘻道妙招独家原创,未经允许,严禁转载