在 Java 中是否允许在不将 return 数据捕获到本地列表的情况下对列表进行排序之类的操作?

Is action like sort list without catching return data into local list allowed in Java?

我知道 Java 传递对象引用的方式,但是这段代码让我很困惑。

简介:在应用程序启动时,服务会获取 JSON 数据,对其进行解析并将其映射到数据模型中。然后我们需要加载一个特定的列表到ListView,但是我们之前还需要对它进行排序和反转。这行代码看起来像这样

Collections.sort(Datastorage.getInstance().getHistoryKeys());
Collections.reverse(Datastorage.getInstance().getHistoryKeys());
//...
//pass HistoryKey object to some other method after a few lines

其中调用的方法 getHistoryKeys() 简单地 returns 列出应用程序启动时由服务填充的对象。

Java 真的允许这样做吗?

我会这样编码,但看来我错了。

ArrayList<Key> keysList = Datastorage.getInstance().getHistoryKeys()
Collections.sort(keysList);
Collections.reverse(keysList);
//...
//pass keysList object to another method after a few lines

我是唯一一个发现我的代码对在我之后维护项目的人来说更具可读性和更容易理解的人吗?

如果 Datastorage.getInstance().getHistoryKeys() 总是 returns 对同一基础对象的引用,则此代码可以工作。这主要是风格问题,但我倾向于认为这不是最佳做法。 API 没有任何暗示它确实总是 returns 同一个对象,这使得这段代码不清楚,至少乍一看是这样。

无论如何,对列表进行排序然后反转其顺序绝对是一种糟糕的编码,因为您可以很容易地以相反的顺序开始排序:

Collections.sort
    (Datastorage.getInstance().getHistoryKeys(), Collections.reverseOrder());

或者,按照您的建议:

List<Key> keysList = Datastorage.getInstance().getHistoryKeys()
Collections.sort(keysList, Collections.reverseOrder());

你的可读性更好:keysList 很短,所以反复阅读它比阅读 Datastorage.getInstance().getHistoryKeys() 两遍要容易得多。 其实 "Datastorage.getInstance().getHistoryKeys()" 就是这么长, 逼得我仔细看了两遍,验证确实是同一件事,两者没有区别。

但不要使用 ArrayList 作为类型,您应该使用接口类型:

List<Key> keysList = Datastorage.getInstance().getHistoryKeys();
Collections.sort(keysList);
Collections.reverse(keysList);

而不是排序 + 反向,你应该一步完成:

Collections.sort(Datastorage.getInstance().getHistoryKeys(), Collections.reverseOrder());

...这样的话,现在单独使用一个keysList变量已经不是更好了,因为Datastorage.getInstance().getHistoryKeys()只出现一次,这样就好了。