Java中内部类常用吗?这与嵌套类是一样的吗?或者在Java中已经被更好的东西所取代了吗?我有一本关于5版本的书,其中有一个使用内部类的例子,但我似乎在某处读到过内部类是“不好”的。
我不知道,希望能听听您的想法。
谢谢。
Java中内部类常用吗?这与嵌套类是一样的吗?或者在Java中已经被更好的东西所取代了吗?我有一本关于5版本的书,其中有一个使用内部类的例子,但我似乎在某处读到过内部类是“不好”的。
我不知道,希望能听听您的想法。
谢谢。
内部类经常被使用,而匿名类 - 类似的东西 - 几乎是必不可少的,因为它们是 Java 最接近闭包的东西。因此,如果您记不住内部类不好的原因,请试着忘记它吧!
它们本质上并不是“坏”的。
它们可能会遭受滥用(例如内部类的内部类)。一旦我的内部类超过了几行,我就喜欢将其提取为自己的类。这有助于可读性,并在某些情况下进行测试。
有一个需要记住的小技巧并不是很明显。任何非static
内部类都将具有对周围外部类的隐式引用(隐式的“this”引用)。这通常不是问题,但如果您要对内部类进行序列化(例如使用XStream),则会发现这可能会导致意想不到的烦恼。
非静态内部类可能会隐藏性能问题。它们可以访问封闭类的成员字段,但不是直接访问,而是通过自动生成的getter方法访问。这比将封闭类的成员复制到内部类中要慢。
其他关于非静态内部类的问题可以在这里找到描述。
它们非常有用,可以被广泛使用。虽然你应该谨慎滥用其功能,但它们并不比其他语言特性更容易被滥用。
public class OuterClass {
private AnonymousInnerClass anonymousInnerClass = new AnonymousInnerClass() {
@Override
protected void printAboutme() {
System.out.println("AnonymousInnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
};
public void displayAnonymousInnerClass() {
anonymousInnerClass.printAboutme();
}
public void displayStaticInnerClass() {
NestedStaticClass staticInnerClass = new NestedStaticClass();
staticInnerClass.printAboutMe();
}
public void displayInnerClass() {
InnerClass innerClass = new InnerClass();
innerClass.printAboutMe();
}
public void displayMethodInnerClass(){
class MethodInnerClass {
private String sampleField = "Method Inner Class";
public void printAboutMe() {
System.out.println("MethodInnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
MethodInnerClass methodInnerClass = new MethodInnerClass();
methodInnerClass.printAboutMe();
}
class InnerClass {
private String sampleField = "Inner Class";
public void printAboutMe() {
System.out.println("InnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
abstract class AnonymousInnerClass {
protected String sampleField = "Anonymous Inner Class";
protected abstract void printAboutme();
}
static class NestedStaticClass {
private String sampleField = "NestedStaticClass";
public void printAboutMe() {
System.out.println("NestedStaticClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
}
在这个例子中,比较了每种非静态嵌套类和静态嵌套类。现在,如果你对每个嵌套类运行Outer类的display方法,你将看到每个嵌套类printAboutMe()方法的输出,其中包含一些反射代码来打印所有嵌套类的成员变量。public class NestedClassesDemo {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.displayInnerClass();
}
}
输出结果如下:
InnerClass.printAboutMe.........
private String sampleField
protected OuterClass this$0