【问题标题】:Class design, case for static methods类设计,静态方法的案例
【发布时间】:2014-05-14 07:44:23
【问题描述】:

我讨论了静态方法的用法,简单来说,参数是在下面的场景中,类定义应该有一个静态方法还是实例方法。有一个定义实体的类,即它的属性是什么以及允许对其进行哪些操作。

class dummy{
    String name;
    String content;

    String someRandomOpeation(){
       ....
    }

    static String createKey( String inputName, String inputContent ){
       return inputName+inputContent;
    }
}

类定义还有一个静态方法,它接受一些参数(比如内容和日期,它在逻辑上定义了一个实例)并使用它来构造一个键(一个字符串)并返回相同的值。现在,如果创建消息的实例,它将具有内容和日期作为字段。参数是我可以获得一个给定名称和内容的键,而不必创建一个有效的实例来拥有静态方法。还是一对名称和内容在逻辑上定义了一个实例这一事实是否表明要创建一个实例并从中获取一个密钥?

【问题讨论】:

  • dogbane - 感谢您的回复,但这里的情况略有不同,其中静态方法是公共的,并且 args 可以在逻辑上定义一个实例。
  • 基于 cmets,问题似乎是针对 static String createKey(String, String)static String createKey(Dummy) 的方法 - String createKey()(实例方法)是第三个选项。

标签: java oop static-methods design-principles instance-methods


【解决方案1】:

仅仅因为您不希望实例化而将方法设为静态不是一个有效的论点。根据设计,我们在 helper/util 类中使用静态方法,这些方法可能有也可能没有自己的任何属性。这些类基本上有助于执行许多不同类可以使用的一些常见操作。此外,这些函数是如此模块化,以至于它们只使用传递给函数的参数来导出输出。

您提到的类将不起作用,因为您无法对 JAVA 中的非静态字段常量进行静态引用。

【讨论】:

  • 该类确实对非静态字段进行了静态引用,静态方法接受 2 个参数并对其进行操作。它从不使用实例字段。为了清楚起见,我已经编辑了名称。
【解决方案2】:

此外,使用与其类字段严格关联的静态方法的缺点是您无法覆盖它们。

【讨论】:

    【解决方案3】:

    是我可以得到一个给定名称和内容的键而不是 必须创建一个有效的实例才能拥有静态方法。

    没有。在这种情况下,您几乎不需要任何课程。您总是可以将数据成员传递给类方法,但这并不意味着我们不需要类。

    还有一个额外的参数 - 封装。拥有一个不带参数的实例方法 getKey() 并隐藏实现细节会更加清晰和美好。

    或者,一对名称和内容在逻辑上定义了一个 instance 说要创建一个实例并从中获取密钥?

    也没有。事实本身并不意味着您应该创建一个实例。

    这里的第一个问题是我们是否需要一个类。我们真的有一些有意义的对象,某物的实例(虚拟)吗?例如,如果我有一个图书馆,那么拥有一本书显然是有意义的,因为我周围有很多书。你有这样的情况吗?此键是否与任何实例(此处为虚拟)在逻辑上相关联,作者和 ISBN 在逻辑上与一本书相关联?这个概念(虚拟)的实例是否与其他一些概念有关系?就像一本书可以出租。 如果这些答案中的大多数是肯定的 - 那么这个方法应该是没有参数的实例方法。

    或者... 您可能只需要一种从 2 个字符串计算密钥的“服务”吗?这就是你所需要的吗?您是否需要其他一些类似的“服务”,独立于实例。如果这些答案大多是“是”,那你甚至不需要上课。或者你可以有一个“服务”类,没有属性,但有这个静态方法和参数(可能还有其他方法)。

    还有一个混合的情况。您仍然需要实例用于其他目的,但您还需要一个 完全独立于任何实例的 createKey 方法,并且只提供一些与类逻辑相关的全局服务。那么静态方法就有意义了。

    我认为你的思维方式是面向函数而不是面向对象的。我认为您需要在脑海中“点击”一下,这将有助于您理解对象和类的正确用途和含义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-11
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2012-01-23
      • 2011-01-17
      相关资源
      最近更新 更多