何时使用静态变量/方法以及何时在Java中使用实例变量/方法?
我想问一个问题,什么时候使用静态变量/方法或在Java中的其他情况下的实例变量/方法是有利的?
我知道这取决于某些情况(比如将util-classes编程为静态方法),但我们可以声明类似于一般策略的东西吗?
在新手级别:
在以下情况下使用实例变量:每个变量对于不同对象具有不同的值。 例如:学生姓名,卷号等。
在以下情况下使用静态变量:变量的值独立于对象(对于每个对象不唯一)。 例如:没有学生。
static
变量通常用于常量,这对于类的所有实例都是通用的。 例如,许多人不喜欢在代码中“硬编码”常量; 他们喜欢使用有意义的名称创建一个public static
或private static
变量,并在其代码中使用它,这应该使代码更具可读性。
简而言之
任何独立于类实例状态的方法或变量都应该是静态的 。
静态变量:当您需要在整个应用程序中使用的东西时,每个实例都需要知道变量。
实例变量:它与对象和对象的属性不同,而静态变量是Class的属性。
静态function:用于做一些实用任务。 无需任何对象声明即可调用。
实例function:需要对象来调用此function。
static或instance取决于您的用途。
将静态变量视为类范围的全局变量,或者,如果使用“final”关键字,则将其视为类范围的全局常量。 明智地使用静态非最终变量 – 它们在所有类实例之间共享,并且可能导致一些非明显的错误。 我建议完全避免使用可变的静态变量 – 有很少甚至没有这种情况,使用dependency injection无法实现这种需求。
使用全局变量总是会使unit testing更加困难 – 需要考虑的另一个缺点。
至于方法:根据定义,每个方法Foo.method(Bar1 b1,Bar2,b2)总是可以有其他等效设计:
Bar.altmethod(Foo f,Bar b2)
和
静态静态方法(Foo f,Bar b1,Bar b2)
你也可以将后一种方法作为intsance方法包装在一个服务类中,该服务类本身就是一个单例(因此该方法的静态有点隐藏它所在的类)。
将您的方法作为您的一个方法参数(静态版本)的类的实例方法的唯一令人信服的理由是,当您希望该类具有子类时,并且它可能对这些子类有用有一个专门的方法实现。
想像
class GeographicalFigure {Object quadrature(){…}}
保留以后添加的可能性可能是有用的
class Circle扩展GeographicalFigure {Object quadrature(){throw new ThisIsNoGoodException(); }}
除此之外,您的所有选择都基本相同。