【问题标题】:Should static methods be separated from Classes with instance methods?静态方法是否应该与具有实例方法的类分开?
【发布时间】:2015-04-25 18:44:50
【问题描述】:

作为一般惯例,静态方法是否应该从具有实例方法的类中分离到另一个类中?

你的理由也有例子吗?

【问题讨论】:

    标签: java oop static design-principles


    【解决方案1】:

    没有规定静态方法必须与非静态方法分开的一般约定。事实上,如果这两种方法之间有足够的相关性,那么将它们分开是违反直觉的。

    回想一下静态方法(和字段)的用例:它们是可以在没有特定类的实例的情况下使用的方法/字段。这通常意味着它们拥有有价值的元数据或执行与其类实例相关的有用操作,但不需要直接实例化该类。

    以Integer 为例。它具有静态 [final] 字段MAX_VALUE 和MIN_VALUE。由于这两个字段都包含在实例化之间不会改变的固定信息,因此必须实例化 Integer 来获取此信息是没有意义的。

    Integer 也有有用的操作parseInt,它将String 转换为int。我们不应该要求Integer 的实例从String 转换为int,尤其是如果我们不将它放入Integer 的实例中。

    总体惯例是将相关方法放在一起,无论它们是否是静态的。您可以在某些 Java 库类中看到更清晰的示例,例如 Integer。

    【讨论】:

    • 只是想知道你的观点,为什么你不想创建一个 Int 的实例来将字符串转换为 int?
    • 您没有可使用的 Integer 实例。这个想法是这是一个factory,或者可以持续产生int 值的东西。
    • 不能像 IntegerStatic.parseInt() 这样的东西在不必创建 int 的情况下工作吗? (我并没有试图证明这只是一个可能的想法,希望能表明我的困惑)
    • 我认为这里更大的混淆是这个例子中int和Integer之间的区别;它们不是一回事。在您提到的场景中,不使用静态方法并创建Integer 的新实例的唯一实际意义是通过对象构造函数。
    • 对不起,我的意思是整数
    【解决方案2】:

    这可能是一个重复的问题,但不,静态方法具有非常具体的好处,这些好处在实例化为对象的类中通常很有价值。

    【讨论】:

      【解决方案3】:

      没有这样的约定。这完全取决于你的情况。某些类可能确实需要静态和非静态成员的混合。

      但有时会看到在某些 java 项目中使用 Constatns.java/ Utils.java 类。你可能会发现 -

      public static final double PI = 3.1416;
      public static getArea(double r){}
      

      这个类包含一些 final 静态属性和一些 final 方法。这些类的目的是在整个项目中提供一些常量或实用方法。

      【讨论】:

        【解决方案4】:

        肯定的答案将由用例决定,但没有这样的约定。最多你有一些Utility 类,它可能有一堆静态方法,其他类用作辅助方法。例如测试字符串是否为电子邮件或从电子邮件中提取用户名等。

        【讨论】:

          【解决方案5】:

          在编写 API 或框架时,将所有静态方法放在一个单独的类中会很有用。 Collections 类就是一个例子。 java.lang.Math 或 java.lang.System 是另一个。

          通常,在以下场景中定义静态方法:

          • 在编写实用程序类时。
          • 如果方法不使用任何实例变量。
          • 如果任何操作独立于实例创建。
          • 如果您确定方法的定义永远不会被更改或覆盖。因为静态方法不能被覆盖。

          请看这里 - https://stackoverflow.com/a/5313383/760393

          【讨论】:

            猜你喜欢
            • 2015-11-25
            • 2011-02-01
            • 2011-11-10
            • 2012-11-12
            • 2015-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多