在Java中返回多个值的最佳实践?

今天我在登录表单后面添加了额外的安全检查,以减缓暴力攻击。 我有多个登录表单,并且做了一个很好的易于调用的函数,它执行所有检查,然后返回结果。

public static ValidateLoginResult validateLogin(HttpServletRequest request, String email, String password) { 

问题是结果不是单个值,结果包括:

 boolean ok String errorMessage boolean displayCaptcha 

为此,我创建了一个新类。 一切正常。

但是我经常使用方便的实用程序函数返回多个值,并且开始发现每次为结果创建一个新类有点烦人。

有没有更好的方法来返回多个值? 还是我只是懒惰? 🙂

不,这种结构在Java中并不存在,但您可以查看可能适合您需求的JavaTuples库 ,并提供一个非常优雅的解决方案。 使用Triplet

不确定“最佳实践”,但实用的选项是返回Map ? 例如

 myMap.put("result", "success"); myMap.put("usernameConfirmed", "bigTom"); return myMap; 

面对百万OO原则,可能会飞,但我听说你想避免结果类的扩散。

您也可以使用Map ,并对存储对象进行类型检查更严格:字符串,布尔值,日期等。

您可以定义Pair类和Triplet类,这样可以解决返回2和3值同时确保类型安全的问题。 在这种特殊情况下,签名可以是

 public static boolean validateLogin(HttpServletRequest request, String email, String password, Pair outputIfOk); 

或者甚至更好,在servlet上下文中,设置一些记录良好的请求属性可能是有意义的。

如果您发现自己需要特殊的类来经常返回结果,那么您很可能会重构这些条款以共享共同的祖先(例如,有一个RequestStatus包含’ok’和’message’字段)。

除此之外,是的,你是懒惰的 – 自定义条款总是比双人和三胞胎更自我记录。

我真的不能想到一种更好,更清洁,更面向对象的方法,从函数中返回多个值,而不是将它们封装在一个类中。

理想情况下,您想要返回的多个值在概念上都属于同一个类,因此以这种方式对它们进行分组是有意义的。 如果他们不这样做,那么你应该在一些较小的函数中分解你的函数,这些函数返回函数本身之外所需的每个值。

据我所知,一些IDE还有一些工具可以帮助在一个类中封装多个值:例如,Eclipse有Refactor --> Extract class...

你可以返回一个Object []数组,java autoboxes,因此它更容易使用。 如果只是短距离移交,为什么不呢。 Ofc风险,可能的阶级演员麻烦,nullchecks等

但它易于编写和使用。

然后,一个静态内部类被快速创建,如果你把它放在返回它的方法旁边,你也知道在哪里找到它(通常在原点附近)

我可能只是自己去class级路线,但根据你想要的function返回,你可能能够逃脱返回某种价值容器。