【问题标题】:Java: `enum` vs `String` as ParametersJava:`enum` 与 `String` 作为参数
【发布时间】:2010-09-21 14:22:44
【问题描述】:

我一直在阅读 Systemsetget 方法的详细信息,但参数通常是字符串。

自包含enum 以来,您是否认为使用String 作为参数是不好的做法?

至少更好的选择可能是public final String,不是吗?

【问题讨论】:

    标签: java enums string constants


    【解决方案1】:

    我认为枚举是比字符串更好的方法。它们是类型安全的,比较它们比比较字符串更快。

    作为 Java 1.5 之前的替代方案,您可以使用 Joshua Bloch 在其《Effective Java》一书中建议的类型安全枚举模式。有关类型安全的枚举,另请参阅 http://www.javacamp.org/designPattern/enum.html

    【讨论】:

      【解决方案2】:

      我学会了“最小意外的方法”。本能地,使用枚举是正确的。所以我会去的。我相信 Java 制造商的想法是一致的。

      编辑:POLS的精彩解释:http://benpryor.com/blog/2006/06/29/api-design-the-principle-of-least-surprise/

      【讨论】:

        【解决方案3】:

        仅仅因为您将 public final String 声明为您希望作为参数传递给方法的东西,没有什么能阻止我传递我喜欢的任何东西。

        使用enums 意味着我无法创建自己的对象来传递,从而保护问题的双方。我认为您应该使用常量字符串代替枚举的唯一一次是,如果您需要为用户留出空间来扩展您的方法以启用自定义功能...

        【讨论】:

        • @Martin:我想将输入与 String const 进行比较,否则会引发无效输入异常,这不好。我问这个问题是因为建议打开密钥,这似乎减少了 Java 中的 WORA 概念。
        【解决方案4】:

        如果您指的是 System.setProperty()、System.getProperty() 或 System.getenv(),我认为字符串在这里是合适的,因为可能的键集是开放的。 key 参数对应于某个文件或存储在某处的实际文本/字符串类型值。

        如果你有一组封闭的键,我认为枚举会更受欢迎。

        【讨论】:

        • 我对此的想法是,枚举可以具有非平台特定设置的映射详细信息,两者都不应仅用于字符串,并且应弃用字符串方法以鼓励采用枚举跨度>
        • 我认为“关闭”键集和“打开”键集之间的区别是这里最重要的因素。如果您查看具有动态加载插件的 API,插件可能会提供可以通过字符串参数访问的附加功能,但使用枚举会更加困难。
        【解决方案5】:

        在现有 API 中使用字符串并不是坏习惯;仅仅因为 Java 现在支持枚举就更改 API 是不好的做法。对于新的 API,我同意其他人所说的。

        【讨论】:

        • 重载?我对 lycono 的评论的副本:“我对此的想法是,枚举可以具有非平台特定设置的映射详细信息,两者都不应仅用于字符串,并且应弃用字符串方法以鼓励采用枚举”
        【解决方案6】:

        如果您的参数集有限且在编译时已知,请使用enum

        如果您的参数集在编译时是开放的且未知的,请使用字符串。

        【讨论】:

          【解决方案7】:

          虽然使用枚举是类型安全的,但需要将枚举转换为字符串,反之亦然。在 Java 中没有内置功能可以做到这一点。你最终会使用 valueOf() 和 toString()。使用这种方法与仅使用字符串没有太大区别。因为您需要处理无法将字符串转换为 Enum 的情况。

          因此,仅使用静态最终字符串很容易,并且是一种常见的做法,AFAIK。

          例如,您将希望使用某些 API 与服务器进行交互。您需要将每个方法和响应定义为 Enum。然后你需要添加 toString 和 valueOf 方法。为什么不使用字符串?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-03-07
            • 2021-08-31
            • 2013-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-25
            相关资源
            最近更新 更多