【问题标题】:Java - about using classes with static members vs. notJava - 关于使用具有静态成员的类与不使用
【发布时间】:2011-09-17 12:20:57
【问题描述】:

所以我有一个关于最佳做法的问题。基本上,我正在执行以下操作以更轻松地访问不同类的成员:

class myClass1 {

public static int var1; 
public static String var2; 

//...

public static void method1() {
//...
}

}

然后在其他类中,我可以使用myClass1.var1myClass1.var2myClass1.method1() 访问myClass1 成员。我看到的另一种设计模式是根本不使用static,只使用myClass1 instance = new myClass1();,然后使用instance.method1(); 或其他什么。

我记得在某处听说过一些关于静态不好的事情……与全局对象或其他有关。但是自从介绍计算机科学以来已经有一段时间了,呵呵。

无论如何,初学 Java 程序员只是想深入了解最佳实践。谢谢。

【问题讨论】:

  • 最好为自己创建一个比 myClass1() 更好的示例。您可能想尝试模拟一些可能会让您感到有趣的东西,例如模拟玩家/关卡/游戏规则的应用程序。您可能会更深入地了解您的问题。

标签: java class static


【解决方案1】:

静态与非静态成员变量和方法的语义完全不同。非静态变量是类的instances的成员;每个实例都有自己的副本。静态变量是类本身的成员;它们与任何特定实例无关。

同样,非静态方法在类的实例上运行,静态方法不绑定到特定实例。

您应该根据问题需要使用静态/非静态。这不是最佳实践的问题。

【讨论】:

    【解决方案2】:

    一般来说,拥有所有成员字段/方法public static 被认为是面向对象编程范式的不好做法。它采用了对象封装和数据安全的所有概念。您班级的任何客户都可以随时随意篡改您的数据。这种做法非常类似于在 C 等过程语言中定义全局变量和函数。

    【讨论】:

    • 您描述的是public 的问题,而不是static。这个问题将static 与非static 进行比较。
    • 实际上,如果您注意到,OP 将类的所有成员定义为public static
    • 是的,但public 不是这里的问题。 OP正在询问静态和非静态之间的区别。他/她的成员可能都是private,问题仍然是比较静态和非静态。
    【解决方案3】:

    这是一个坏主意有几个原因:

    1. 公共字段。使用公共字段几乎不可能编写线程安全代码。它还使维护或修改代码变得困难。在理论上,它违反了封装,这是 OO 的基本思想之一及其所有后果。例如,如果您有复杂的状态,并非所有字段值组合都是有效的,那么您就有麻烦了。
    2. 静态字段。虽然静态字段有其合法用途,但应尽量减少。它们不是遗传的,这很容易导致混乱,而且在最好的情况下它是一个定时炸弹。

    总而言之:除非必要,否则不要使用静态字段,即使那样它们也应该是私有的。

    值得注意的例外显然是静态和最终字段(又名常量),可以将其声明为公共而没有太多危险。

    【讨论】:

      【解决方案4】:

      一般来说,除了static final 变量之外,永远不会创建静态变量,这些变量就像常量一样。主要原因是多个线程可以同时更改全局变量的状态,从而导致该类的每个对象实例的状态不可预测。

      【讨论】:

        【解决方案5】:

        根据面向对象的基本问题:

        1. 不应在类外访问变量。所以它们应该是私有的而不是公共的,除了接口情况。这也适用于静态变量。

        2. 您想使用公共方法访问变量。如果是静态变量,您将使用静态公共方法。

        【讨论】:

          【解决方案6】:

          这完全取决于你在做什么。如果您的类仅包含无状态实用程序函数,那么这可能没问题。如果您正在尝试任何一种真正的 OOP 设计,那么这是没有意义的。

          如果您使用类的实例来为“现实世界”中的对象建模,那么它们将需要实例变量,并且应该有实例方法来作用于该数据。每个实例都封装该数据并提供合适的行为。

          【讨论】:

            猜你喜欢
            • 2012-12-15
            • 2010-10-17
            • 1970-01-01
            • 2012-01-16
            • 1970-01-01
            • 1970-01-01
            • 2012-04-13
            • 2012-09-28
            相关资源
            最近更新 更多