Java 静态方法和静态变量,糟糕的设计实践?
可能重复:Java 静态方法和静态变量,糟糕的设计实践?,java,oop,static,Java,Oop,Static,可能重复: 几年前在大学里学习过面向对象编程和设计,我记得讲师们对使用静态变量或静态方法的人非常生气,因为他们把静态描述为一种非常糟糕的设计 我的理解是 静态类型的东西,是获得全局“愿景”的东西,即它可以被任何东西访问 我的理解正确吗?是否有关于使用static的信息导致其使用不当?有没有办法避免在代码中使用静态变量或方法 顺便说一句,我知道主方法的静态是应用程序成功运行的先决条件。静态变量或方法没有错。只是在OOP中,您希望尽可能多地将行为与对象关联起来,这意味着使用实例方法和变量。话虽如此
几年前在大学里学习过面向对象编程和设计,我记得讲师们对使用静态变量或静态方法的人非常生气,因为他们把静态描述为一种非常糟糕的设计 我的理解是 静态类型的东西,是获得全局“愿景”的东西,即它可以被任何东西访问 我的理解正确吗?是否有关于使用static的信息导致其使用不当?有没有办法避免在代码中使用静态变量或方法
顺便说一句,我知道主方法的静态是应用程序成功运行的先决条件。静态变量或方法没有错。只是在OOP中,您希望尽可能多地将行为与对象关联起来,这意味着使用实例方法和变量。话虽如此,在某些特定情况下,静态成员是必需的:构造函数(如您所提到的)和单例模式就是很好的例子。静态变量或方法没有错。只是在OOP中,您希望尽可能多地将行为与对象关联起来,这意味着使用实例方法和变量。话虽如此,在某些特定情况下,静态成员是必需的:构造函数(如您所述)和单例模式就是很好的例子。静态主要用于访问类成员而不创建类实例。正如您所知,我们为什么要编写
publicstaticvoidmain()
只要在运行时使用bcoz,jvm就可以访问此方法,而无需创建类对象并启动程序
这取决于您的需求,即您如何使用或说如何使用访问说明符将类的成员声明为private、public、default和protect作为访问级别,而static用于将其作为访问级别的static
如果没有static,您必须将您的成员声明为public,或者如果您继承了您的类,那么也必须将其声明为protected。与在同一个包中一样,您定义了类,然后只是静态地继承该类。对于不使用inhert类的情况,您需要创建该类的对象,然后可以访问这些成员(请注意,它基于访问说明符)
以下是链接以了解更多详细信息
静态主要用于访问类成员而不创建类实例。正如您所知,我们为什么要编写
publicstaticvoidmain()
只要在运行时使用bcoz,jvm就可以访问此方法,而无需创建类对象并启动程序
这取决于您的需求,即您如何使用或说如何使用访问说明符将类的成员声明为private、public、default和protect作为访问级别,而static用于将其作为访问级别的static
如果没有static,您必须将您的成员声明为public,或者如果您继承了您的类,那么也必须将其声明为protected。与在同一个包中一样,您定义了类,然后只是静态地继承该类。对于不使用inhert类的情况,您需要创建该类的对象,然后可以访问这些成员(请注意,它基于访问说明符)
以下是链接以了解更多详细信息
使用静态变量的主要合法理由是 单例的访问器方法,特别是使用的方法,需要静态方法
关于单例没有什么“不好”的。使用静态变量的主要合法理由是,没有其他方法可以做到这一点 单例的访问器方法,特别是使用的方法,需要静态方法
关于单例并没有什么“坏”的。静态变量和静态方法是完全不同的事情 静态变量是不好的,除非它们表示某种类型的“单例”,如果它们表示,那么在OOP中最好创建实际的单例类(特别是如果可以使用enum单例)。除此之外,静态变量使多线程编程变得困难,甚至在单线程编程中也可以做到这一点,在单线程编程中,您“意外地”需要两个带有静态字段的类实例
另一方面,静态方法通常很好,只要它们不访问任何静态数据,而只对其参数进行操作。当然,如果您注意到有
static void MyStaticUtils.operateOnFoo(Foo-Foo)
,那么最好使用非静态void Foo.operate()
方法。但有时您没有向现有类添加方法的特权,必须对现有方法返回的实例进行操作,静态实用程序方法绝对是不错的选择。静态变量和静态方法完全不同
静态变量是不好的,除非它们表示某种类型的“单例”,如果它们表示,那么在OOP中最好创建实际的单例类(特别是如果可以使用enum单例)。除此之外,静态变量使多线程编程变得困难,甚至在单线程编程中也可以做到这一点,在单线程编程中,您“意外地”需要两个带有静态字段的类实例
另一方面,静态方法通常很好,只要它们不访问任何静态数据,而只对其参数进行操作。当然,如果您注意到有static void MyStaticUtils.operateOnFoo(Foo-Foo)
,那么最好使用非静态void Foo.operate()
方法。但有时您没有向现有类中添加方法的特权,必须对现有方法返回的实例进行操作,然后静态实用程序方法绝对是不错的选择。可能重复-注意:链接只处理静态变量。静态方法没有错-