You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用List<List<Object>>替代List<DTO>的原始用法是否有已知反模式名称?

用List<List<Object>>替代List<DTO>对应的反模式名称

这种放弃强类型DTO、改用无约束嵌套原始集合的编程行为,对应以下几种常见反模式:

  • 数据泥球(Data Clump):这是最贴切的反模式——原本应该被封装为一个完整对象的关联数据(比如示例中的姓名、年龄),被拆分成零散的原始值集合,没有利用面向对象的封装特性来组织和抽象业务数据。
  • 原始痴迷(Primitive Obsession):属于数据泥球的延伸,过度依赖原始类型和原始集合承载业务信息,拒绝创建合适的自定义类型(如DTO)来表达业务概念。
  • 弱类型滥用(Weak Type Abuse):放弃静态类型语言的类型安全优势,用List<Object>这类无明确类型约束的结构存储数据,导致编译期无法校验数据结构,运行时易出现类型转换错误。

示例代码

class Main {
    public static void main(String[] args) {
        new Main().run();
    }

    private void run() {
        final List<Person> people = getPeople();
        people.forEach(p -> System.out.println(p.getName()));
        System.out.println("--------");
        final List<Object> objects = getObjects();
        objects.forEach(o -> System.out.println(((List<Object>) o).get(0)));
    }

    public List<Person> getPeople() {
        return Arrays.asList(
            new Person("john", 33),
            new Person("jeff", 22),
            new Person("jack", 11)
        );
    }

    public List<Object> getObjects() {
        return Arrays.asList(
            Arrays.asList("john", 33),
            Arrays.asList("jeff", 22),
            Arrays.asList("jack", 11)
        );
    }
}

class Person {
    private final String name;
    private final int age;

    Person(final String name, final int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }
}

这种写法的弊端

从示例能明显看出:

  • 可读性极差:((List<Object>) o).get(0)需要开发者自行猜测元素含义,远不如p.getName()直观。
  • 类型不安全:编译阶段无法校验集合内元素的类型和结构,运行时极易触发ClassCastException或索引越界异常。
  • 维护成本高:修改数据结构(比如新增性别字段)时,需要逐一修改所有依赖该嵌套列表的代码,无法通过DTO的属性或方法统一管理。

内容的提问来源于stack exchange,提问作者rostIvan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:33:29