使用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
相关产品推荐
相关产品推荐

