关于java:静态方法和静态变量,糟糕的设计实践?

Static Methods and static variables, bad design practise?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why are static variables considered evil?

几年前,我在大学里学习过面向对象的编程和设计,我记得讲师对使用静态变量或静态方法的人非常生气,因为他们把静态描述成一个非常糟糕的设计。

我的理解是静态类型的东西,是获得全局"视觉"的东西,也就是说,它可以被任何东西访问。

我的理解正确吗?有没有关于静态的使用的信息会使它不能正常使用?有没有一种方法可以避免在代码中使用静态变量或方法?

顺便说一句,我知道静态主方法是成功运行应用程序的前提。


静态变量或方法没有问题。这只是因为对于OOP,您希望尽可能多地将行为与对象关联起来,这意味着使用实例方法和变量。尽管如此,在某些特定情况下静态成员是必要的:构造函数(如您所提到的)和单例模式是很好的例子。


静态变量和静态方法是完全不同的。

静态变量是坏的,除非它们代表某种类型的"singleton",如果它们代表,那么在OOP中,最好创建实际的singleton类(特别是如果可以使用枚举singleton)。另外,静态变量使多线程编程变得困难,甚至在单线程编程中也能做到这一点,在单线程编程中,您"意外"需要两个带有静态字段的类实例。

另一方面,静态方法一般都很好,只要它们不访问任何静态数据,而是只对它们的参数进行操作。当然,如果你注意到你有static void MyStaticUtils.operateOnFoo(Foo foo),那么最好使用非静态void Foo.operate()方法。但有时您没有向现有类添加方法的奢侈,必须对现有方法返回的实例进行操作,然后静态实用程序方法绝对是不错的选择。


静态主要用于访问类成员而不创建类实例。正如您所知,我们为什么要在运行时编写public static void main(),而jvm只需bcoz就可以访问这个方法,而无需创建类对象和启动程序。

它取决于您的要求,即如何使用或说如何使用访问说明符声明类的成员为私有、公共、默认和保护访问级别,而静态的则将其作为静态访问级别。

如果不使用static,则必须将成员声明为public,或者如果继承了类,则也将其设置为protected。与在同一个包中一样,您定义了类,然后只定义了用于继承类的静态类。如果不使用inhert类,则需要创建该类的对象,然后可以访问其中的成员(请注意,它基于访问说明符)。

下面是详细信息的链接

http://xahlee.info/java-a-day/access_specifiers.html

http://www.javabeginner.com/learn-java/introduction-to-java-access-modifiers


使用静态变量的主要合法情况是单例模式,而且没有其他方法可以做到这一点。

单例访问器方法,尤其是使用延迟初始化的访问器方法,需要静态方法。

单身没有什么"坏"的。