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