java 最佳实践 -outer class 内部 class 访问的静态变量
java best practice -outer class static variable accessed by inner class
class OuterClass {
static int j=99;
static class InnerClass {
public void doSomething() {
while(true)
OuterClass.j= 100;
}
}
}
}
使用上面的代码,当 OuterClass 需要进行垃圾收集时,垃圾收集是否存在任何问题,但可以说 doSomething 正在引用一个静态变量,这会是一个问题吗?我关心的是内部 class 通过访问变量 j 引用了外部 class 并且我想知道这是否会影响 OuterClass 被 GC。
虽然您将其命名为InnerClass
,但它不是内部class。它只是一个 static
嵌套 class。
此类 class 的实例没有引用封闭 class 的任何实例。此外,您正在引用封闭 class 的 static
字段。绝对没有引用 OuterClass
的任何实例。
您的 InnerClass
中的任何内容都无法阻止 OuterClass
类型的实例被垃圾回收。
我是不是误解了你的问题?您是在询问 classes 是否被垃圾收集?
类 不受 GC 的影响,对象会。如果您创建一个 InnerClass 类型的对象,GC 将不会触及它所引用的任何内容。但是,因为您只是引用一个静态变量,所以您没有引用任何 OuterClass 类型的对象(无论如何在该代码片段中)。因此,GC 可以自由删除任何不需要的 OuterClass 类型的对象,而不会以任何方式影响 InnerClass 类型的对象的功能。
请注意,如果您所做的只是从 InnerClass 引用 OuterClass 中的静态变量,您可能不应该将 InnerClass 定义为嵌套 class。
由于j字段是静态的,它的存在超出了OuterClass的单个实例的范围。 InnerClass 是静态的这一事实将它与 OuterClass 的任何实例分离。
As with class methods and variables, a static nested class is
associated with its outer class. And like static class methods, a
static nested class cannot refer directly to instance variables or
methods defined in its enclosing class: it can use them only through
an object reference.
Note: A static nested class interacts with the instance members of its
outer class (and other classes) just like any other top-level class.
In effect, a static nested class is behaviorally a top-level class
that has been nested in another top-level class for packaging
convenience.
class OuterClass {
static int j=99;
static class InnerClass {
public void doSomething() {
while(true)
OuterClass.j= 100;
}
}
}
}
使用上面的代码,当 OuterClass 需要进行垃圾收集时,垃圾收集是否存在任何问题,但可以说 doSomething 正在引用一个静态变量,这会是一个问题吗?我关心的是内部 class 通过访问变量 j 引用了外部 class 并且我想知道这是否会影响 OuterClass 被 GC。
虽然您将其命名为InnerClass
,但它不是内部class。它只是一个 static
嵌套 class。
此类 class 的实例没有引用封闭 class 的任何实例。此外,您正在引用封闭 class 的 static
字段。绝对没有引用 OuterClass
的任何实例。
您的 InnerClass
中的任何内容都无法阻止 OuterClass
类型的实例被垃圾回收。
我是不是误解了你的问题?您是在询问 classes 是否被垃圾收集?
类 不受 GC 的影响,对象会。如果您创建一个 InnerClass 类型的对象,GC 将不会触及它所引用的任何内容。但是,因为您只是引用一个静态变量,所以您没有引用任何 OuterClass 类型的对象(无论如何在该代码片段中)。因此,GC 可以自由删除任何不需要的 OuterClass 类型的对象,而不会以任何方式影响 InnerClass 类型的对象的功能。
请注意,如果您所做的只是从 InnerClass 引用 OuterClass 中的静态变量,您可能不应该将 InnerClass 定义为嵌套 class。
由于j字段是静态的,它的存在超出了OuterClass的单个实例的范围。 InnerClass 是静态的这一事实将它与 OuterClass 的任何实例分离。
As with class methods and variables, a static nested class is associated with its outer class. And like static class methods, a static nested class cannot refer directly to instance variables or methods defined in its enclosing class: it can use them only through an object reference.
Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.