1. 主页 > 小妙招

Java方法返回多个对象的封装技巧与实例

(挠头)刚学Java那会儿,我总在想:一个方法只能return一个值?那我要返回用户名和年龄怎么办?难道要写两个方法?这和短视频新手如何快速涨粉遇到的第一个困惑一样——平台规则都没摸清,怎么玩得转?

上周还有个实习生问我:"哥,我查数据库既要返回用户信息又要返回分页数据,总不能把数据库连接暴露出去吧?" 今天咱们就聊聊这个让新手抓狂的问题——??如何优雅地打包多个对象回家??!

一、那些年我们走过的弯路

??错误示范1:用Object数组装货??

java复制
public Object[] getUserInfo() {
    return new Object[]{"张三", 25, "北京"};
}

(拍大腿)调用方得这么写:

java复制
Object[] result = getUserInfo();
String name = (String)result[0]; // 随时可能ClassCastException

??类型转换就像开盲盒??,指不定什么时候就爆炸!

??错误示范2:玩List大杂烩??

java复制
public List getUserInfo() {
    return Arrays.asList("张三", 25, "北京");
}

(扶额)这样写虽然能跑,但三个月后你自己都记不住第2个元素是年龄还是体重...

二、老司机の正确姿势

??技巧1:专属快递盒——封装对象??

java复制
public class UserDTO {
    private String name;
    private Integer age;
    private String address;
    // 构造器+getter+setter
}

public UserDTO getUserInfo() {
    return new UserDTO("张三", 25, "北京");
}

(竖大拇指)这才是正经路子!??字段含义一目了然??,调用方用起来也放心。

??技巧2:临时包裹——Pair/Triple类??
比如用Apache Commons的:

java复制
public Pair getUserBaseInfo() {
    return Pair.of("张三", 25);
}

适合??快速测试场景??,但生产环境慎用——容易变成"神秘盒"。

??技巧3:自建元组工具箱??

java复制
public class Tuple3 {
    public final A first;
    public final B second;
    public final C third;
    
    public Tuple3(A a, B b, C c) {
        this.first = a;
        //...省略
    }
}

(眨眼)这样既保证类型安全,又不用为临时需求新建类。

三、实战场景对对碰

??场景一:分页查询??

java复制
// 错误做法:返回Object[2]
// 正确姿势:
public class PageResult {
    private List data;
    private Integer total;
}

public PageResult searchUsers() {
    //...查询逻辑
}

??场景二:多表联查??
(敲黑板)比如要返回用户信息+订单列表:

java复制
public class UserDetailVO {
    private User user;
    private List orders;
    private Statistics stats;
}

比用Map清爽多了!

四、灵魂拷问时间

??Q:为啥不直接用Map封装???
(叹气)见过最惨的案例:某人用Map存了20个字段,半年后新同事改需求,不小心把"age"拼成"aeg",直到上线才报错...??编译期能发现的问题,不要拖到运行时!??

??Q:返回多个对象会影响性能吗???
完全多虑!对象封装的内存开销可以忽略不计。比起后期维护成本,这点损耗不值一提。

??Q:动态数量对象怎么返回???
比如根据条件返回不同组合,建议用??建造者模式??:

java复制
public class ResultBuilder {
    private User user;
    private Company company;
    
    public ResultBuilder setUser(User u) {
        this.user = u;
        return this;
    }
    //...其他set方法
    
    public Result build() {
        return new Result(user, company);
    }
}

小编观点:返回多个对象就像打包行李,胡乱塞进行李箱(Object数组)虽然省事,但找东西时准抓瞎。花点时间给每件衣服(数据)准备专用收纳袋(DTO类),才是可持续发展的正道!

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