Java-关于使用具有静态成员的类与不使用静态成员的类

Java-关于使用具有静态成员的类与不使用静态成员的类,java,class,static,Java,Class,Static,所以我有一个关于最佳实践的问题。基本上,我正在执行以下操作,以便更轻松地访问不同类的成员: class myClass1 { public static int var1; public static String var2; //... public static void method1() { //... } } 然后在其他类中,我可以通过myClass1.var1,myClass1.var2,myClass1.method1()访问myClass1成员。我看到的另一种设计模

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

class myClass1 {

public static int var1; 
public static String var2; 

//...

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

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

我记得在某个地方听到一些关于静电不好的消息。。。关于全局对象或任何东西的。但是自从计算机科学入门已经有一段时间了,呵呵


不管怎样,初学者Java程序员只是想了解一些最佳实践。谢谢

一般来说,对于面向对象编程范式,将所有成员字段/方法都设置为公共静态
被认为是不好的做法。它采用了对象封装和数据安全的所有概念。您的类的任何客户端都可以随时篡改您的数据。这种做法与用过程语言(如C)定义全局变量和函数非常相似。

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


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

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

类似地,非静态方法操作类的实例,静态方法不绑定到特定实例


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

一般来说,除了
静态final
变量(类似于常量)外,人们从不使用静态变量。主要原因是多个线程可以同时更改全局变量的状态,从而导致该类的每个对象实例的状态不可预测。

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

  • 公共字段。使用公共字段几乎不可能编写线程安全代码。这也使得维护或修改代码变得困难。在理论层面上,它违反了封装,而封装是OO的基本思想之一,其后果也是如此。例如,如果您有一个复杂的状态,其中不是所有字段值的组合都有效,那么您就有麻烦了
  • 静态字段。虽然静态字段有其合法用途,但应将其保持在最低限度。他们不是遗传的,这很容易导致混乱,在最好的时候,这是一颗滴答作响的定时炸弹
  • 总而言之:除非必要,否则不要使用静态字段,即使这样,它们也应该是私有的


    明显的例外是静态字段和最终字段(又称常量),它们可以在没有太多危险的情况下声明为公共字段。

    根据面向对象的基本关注点:

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

  • 您希望使用public方法访问变量。对于静态变量,您将使用静态公共方法


  • 您所描述的问题是
    public
    ,而不是
    static
    。这个问题是比较
    静态
    和非
    静态
    。实际上,如果您注意到,OP将类的所有成员定义为
    公共静态
    。是的,但是
    公共
    不是这里的问题。OP询问静态和非静态之间的区别。他/她的成员可能都是
    私有的
    ,问题仍然是关于静态和非静态的比较。查看此帖子:最好为自己创建一个比myClass1()更好的示例。您可能想尝试建模一些可能会让您感到有趣的东西,比如模拟玩家/级别/游戏规则的应用程序。你也许能对你的问题有更多的了解。