佬们, Java 方法有时候要返回 Map,但是可读性很差,不知道有没有替代方法?

78 天前
 shitshit666
    /**
     * 根据 refId 和 funcCode 查询收藏个数
     *
     * @param refIds   关联资源的 id
     * @param funCode `like` 点赞 `collect`收藏
     * @param module  模块
     * @return refId 和数量映射
     */
    Map<Long, Integer> collectCountByRef(List<Long> refIds, String funCode, Integer module);

    /**
     * 查询收藏或点赞状态
     * @param module 1:****
     * @param userId  用户 id
     * @param funCode `like` 点赞 `collect`收藏
     * @param ds id
     * @return inspireId 和状态映射
     */
    Map<Long, Boolean> getCollectStatus(Integer module, Long userId, String funCode, List<Long> inspireIds);
3299 次点击
所在节点    Java
32 条回复
wxw752
78 天前
封装个对象,返回的时候对象接收。我们公司查库之后严禁返回 Map
inza9hi
78 天前
用 Map 相当于把静态语言当做动态语言用。如果能好好管理一下 Map 的 Key ,其实也还好,胜在自由。
SoloCompany
78 天前
@wxw752 你有看问的是啥吗, 那请问 Map<Long, Integer> 如何封装成一个对象? 一个有 2 的 64 次方个字段的对象, 字段名分别为 r0, r1, 到 r 无穷吗
ZiLong
78 天前
对象类型就是命名的 Map ,换一下思路,改成 List<XXX>,XXX 是你定义的返回对象类型,比如你第一个方法,XXX 的属性就是 filedName ,count
mx1700
78 天前
我觉得可读性没什么问题呀,如果非要改,可以把 map 封装到一个类里,比如叫 CollectCounter ,类暴露一个方法: getCount(refId)
Znemo
78 天前
非要讲究某种意义上的可读性的话,就一个类持有一个 Map 或者继承某个 Map ,做一样的事,再提供一些查询函数。在你这个场景中,感觉意义不是很大。
dallaslu
78 天前
不如给 Map 变量起个好名字:

```java
Map<Long, Integer> likeCountOfRefId = collectCountByRef(refIds, "like", module);
```
iseki
78 天前
我觉得还行,没啥问题,你又不是返回个 Map<String, Any>,你还是觉得实在不行,把这个 Map 自己包一下给个名字,不过我觉得没必要。
xiangyuecn
77 天前
好了,8 小时的工作量变 1 小时了😂
wssy001
77 天前
bean 字段是确认的,那就禁用 Map
如果是动态的,那就和定规矩的吵一架,要么把动态字段需求砍掉,要么就允许用 Map
shitshit666
77 天前
@dallaslu 是的目前是这个样子,包括写注释,但是别人看到这个方法的时候还是可能会蒙
shitshit666
77 天前
@xiangyuecn 确实
shitshit666
77 天前
@iseki 目前打算是包一层了,多人协作,可维护性也很重要。
shitshit666
77 天前
找到一个方法叫枚举 key 的 map: https://blog.51cto.com/u_16213606/7112798
sagaxu
77 天前
Map 可读性差,说的是 key 表示字段名,value 是值,这是用 Map 表达 POJO ,读代码的人无法感知有哪些字段,IDE 也不能补全,拼写错误也照常编译。

而你这个例子,返回的 data 并不是 POJO ,key 本身也是开发时无法穷举列出的值,此 Map 是 value to value 的映射。这就不适合用其它方式封装。如果你的 value 是开发时可确定的状态,比如说订单状态,流程状态,那么可以定义 enum 类型代替 Long ,返回 Map<enum, V>,至于内部是用 EnumMap 还是 HashMap ,这都不是调用者该关心的。
VeryZero
77 天前
用枚举。

map 不是一定就可读性差,主要是语意是否清晰
leonshaw
77 天前
你的例子应该返回 List ,跟输入对应。
wxw752
77 天前
@SoloCompany #3 我从未在我司的代码中看到任何 Map 返回的参数。无论是什么,肯定是有方法封装的。
oneisall8955
77 天前
那你返回 list 对象,用的时候再转 map 。。。
diagnostics
77 天前
@SoloCompany List<XX> 不行吗?用 Map 是因为要 O(1) 查询,只用来迭代的话,Tuple ,Object 都能描述一个 String + Long

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1069297

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX