【发布时间】:2008-12-10 14:32:31
【问题描述】:
我有一个看似简单的场景,我想要一个简单的解决方案,但不清楚哪个是“最正确”或“最 Java”。
假设我在某个类中有一个小的身份验证(客户端客户端)方法。身份验证可能由于多种原因而失败,我想为控制流返回一个简单的布尔值,但也为用户返回一个字符串消息。这些是我能想到的可能性:
- 返回一个布尔值,并传入一个 StringBuilder 来收集消息。这是最接近 C 风格的方式。
- 抛出异常而不是返回 false,并包含消息。我不喜欢这样,因为失败也不例外。
- 使用布尔值和字符串创建一个名为 AuthenticationStatus 的新类。对于一种小方法来说,这似乎有点过头了。
- 将消息存储在成员变量中。这会引入一个潜在的竞争条件,我不喜欢它暗示一些实际上并不存在的状态。
还有其他建议吗?
编辑错过了这个选项关闭
- 返回 null 表示成功 - 这不安全吗?
编辑解决办法:
我选择了最面向对象的解决方案并创建了一个小的 AuthenticationResult 类。我不会用任何其他语言来做这件事,但我喜欢用 Java 做。我也喜欢这个建议 返回 String[] 因为它类似于 null 返回但更安全。 Result 类的一个优点是,如果需要,您可以收到包含更多详细信息的成功消息。
【问题讨论】:
-
你能解释一下为什么它比返回哨兵值更OO吗?我正在经历同样的情况并使用您的解决方案。但我不知道为什么这个解决方案比其他解决方案更好。
-
@Rumel,我认为其他答案和 cmets 很好地解释了这一点,但简而言之,哨兵值是危险的,因为它滥用了类型系统中的漏洞(您可以为该类型返回的值在任何其他情况下您都不会期望)。使用 null 特别危险,因为缺少 null 检查很容易且很常见,并且可能导致错误。它更加面向对象,因为它使用了一个专门定义类型的类,该类型表示“身份验证结果”或“带有可选消息的状态”,因此不会以牺牲更重量级的类型为代价进行类型滥用。
标签: java exception return-value