如何在事件类中简洁实现待同步人员ID列表的获取逻辑
首先注意你贴的Person模型类属性存在笔误:四个属性都加了static修饰符,会导致所有Person实例共享属性值,不符合单实例独立属性的业务设计,建议去掉static修饰。
两种方案对比
结合你「存放系统内所有待同步的人员ID列表」的需求,两种方案的优劣势如下:
- 第一种返回
List<String>ID列表的方案:更贴合你当前明确的同步ID需求,消费者拿到结果可直接使用,无需额外提取ID,减少重复代码。缺点是扩展性较差,若后续同步逻辑需要用到人员的姓名、年龄等其他属性,需要新增方法或修改现有方法返回值。 - 第二种返回
List<PersonModel>实体列表的方案:扩展性更强,后续不管是要ID还是其他人员属性都能直接获取,适用场景更多。缺点是如果消费者仅需要ID,需要多一步ID提取的操作,但该操作的开发和性能成本都极低。
更简洁的实现方案
首先你的现有事件类设计只支持存储单个人员,只能返回单元素列表,不符合「所有待同步人员」的需求,建议直接将事件类的属性调整为人员集合,同时用JDK内置的不可变集合方法简化代码,避免外部随意修改事件内的承载数据,安全性更高:
public class MyEventSync extends AbstractEvent{ // 直接存储所有待同步的人员集合 private final List<PersonModel> syncPersonList; // 构造器支持传入单个或多个待同步人员 public MyEventSync(PersonModel... persons) { this.syncPersonList = Arrays.asList(persons); } // 方案1:直接返回不可变的待同步ID列表,贴合当前需求 public List<String> getSyncPersonIds() { // Java 16+ 可直接用toList()返回不可变集合,低于16版本用.collect(Collectors.toUnmodifiableList()) return syncPersonList.stream() .map(PersonModel::getId) .toList(); } // 方案2:返回不可变的人员实体列表,兼顾后续扩展需求 public List<PersonModel> getSyncPersons() { return Collections.unmodifiableList(syncPersonList); } }
如果你确定场景仅需要支持单人员同步,可以直接用Collections.singletonList简化原来的单元素列表返回逻辑,无需手动创建ArrayList再添加元素:
// 简化后的单ID列表返回 public List<String> getPersonsById() { return Collections.singletonList(personModel.getId()); }
选择建议
- 若确定当前及后续该事件的唯一消费场景就是获取ID做同步,选返回ID列表的方案更直接
- 若不确定后续是否会有其他消费逻辑需要用到人员的其他属性,选返回实体列表的方案扩展性更好
内容的提问来源于stack exchange,提问作者user16125782
相关产品推荐
相关产品推荐

