Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类设计,静态方法的案例_Java_Oop_Static Methods_Design Principles_Instance Methods - Fatal编程技术网

Java 类设计,静态方法的案例

Java 类设计,静态方法的案例,java,oop,static-methods,design-principles,instance-methods,Java,Oop,Static Methods,Design Principles,Instance Methods,我曾经讨论过静态方法的用法,简单地说,在下面的场景中,一个类定义应该有一个方法作为静态方法还是实例方法。有一个类定义一个实体,即它的属性是什么以及允许对它进行什么操作 class dummy{ String name; String content; String someRandomOpeation(){ .... } static String createKey( String inputName, String inputCont

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

class dummy{
    String name;
    String content;

    String someRandomOpeation(){
       ....
    }

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

类定义还有一个静态方法,它接受一些参数,比如content和date,这两个参数逻辑地定义了一个实例,并使用它构造一个键和一个字符串,然后返回相同的值。现在,如果创建了消息的实例,则其内容和日期将作为字段。是一个参数,我可以在给定名称和内容的情况下获取一个键,而不必创建一个有效的实例来拥有静态方法。或者,一对名称和内容逻辑上定义了一个实例,这是否意味着要创建一个实例并从中获取密钥

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


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

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

参数是我可以得到一个给定名称和内容的密钥,而不是 必须创建一个有效实例才能使用静态方法

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

还有一个额外的参数-封装。有一个不带参数的实例方法getKey,并隐藏实现细节,这会更清晰、更好

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

也不是。事实本身并不意味着你应该创建一个实例

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

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

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


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

请参阅:dogbane-感谢您的回复,但这里的情况略有不同,静态方法是公共的,args可以在逻辑上定义一个实例。根据注释,这个问题似乎是针对静态String createKeyString、String或静态String createKeyDummy的方法,其中String createKey实例方法是第三个选项。该类对非静态字段进行静态引用,静态方法接受2个参数并对其进行操作。它从不使用实例字段。为了清晰起见,我对这些名字进行了编辑。