单纯列表转树的逻辑我是清楚的,不管用什么实现方案,核心应该都是根据 id 找到父节点,并将当前节点添加到父节点的子节点列表属性中。
我的问题是在java 中能不能写一个通用的实现?
比如:只有一个资源实体类需要转树时,那直接写一个与资源实体类相对应的节点类,这个节点类不仅有资源实体类的所有属性,而且还多一个子节点列表属性就可以了。但如果有多个需要转换树结构的资源呢?总不能给每一个需要转换的资源实体类都创建对应的节点类吧?而且即便是只有一个,也是有弊端的,如果实体类有几百个属性,那这几百个属性还要挨个重写一遍?
我现在想到了两种方案,但各有弊端,具体如下:
第一:利用泛型,建一个通用的 TreeNode,就像这样:
public class TreeNode<T> {
private T PO;
private List<TreeNode> childList;
....
}
这样就是将实体类对象用泛型保存,子节点列表在外面单独用一个属性保存,不管有多少各类需要转换,也不管需要被转换的类型里有多少属性都可以用,但这样的话,子节点列表就和其他属性割裂开了,对前端或其他树状结构数据消费者可能是不友好。
第二:利用继承,将包含 childList 的 TreeNode 作为所有需要实现列表转树的父类。但这样的弊端就更明显了,比如有一个需要转换树节点的类已经继承了其他类怎么办?而且很多甚至大部分需要转换的都是实体类,而实体上是没有childList 的,这样做虽然没有直接改实体类,但是在父类上加了childList,其对象也是会有childList 属性的,那这还能算是一个实体对象吗是不是有点不合适?
目前就想到以上两种方案,但是都不尽人意,项目上大概率不会采用。希望有大佬提供更成熟的方案指点一二,不甚感激。
喜欢重复造轮子?这不是有现成的?干嘛不用呢?
https://doc.hutool.cn/pages/TreeUtil/