项目中需要使用到内部类,对外隐藏实现细节,代理类提供访问接口。见以下代码:
public class A
{
private class B
{
private static final B invalidB = new B(); //error
//to construct a invliad B
private B()
{
}
//to construct a valid B
public B(int urlsCount)
{
}
}
}
上面的代码有一行标注了 error ,表示这一行将通不过编译。让我们来揭示原因。
首先,要明确一点,java 的内部类如果不是 static 的,必须经过外层类的构造才会被构造出来,即,每构造一个内部类,都会产生一个内部类。则只有在定义了一个 A对象 a 的情况下,才会产生 B 这个类,设想一下,如果内部类声明了一个static B 对象成员 b ,那么,就要求 B 这个类一定要被编译器提前知道,具体多提前呢,应该是所有类依赖,重定位解决后,但肯定是在所有非 static 对象定义之前,此时b 的存在就是个疑问了,从语意角度来讲,b 是在 a 构建之后存在的,但从编译器角度讲,b 必然又在 a 之前构建,所以就矛盾了,编译器当然不会放过你。
正确的写法应该将 B 类声明为 static ,这样不仅可以解决上面的问题,而且效率也提高不少,因为 B 类一直存在,不会每次构造一个 A 对象就重新生成一个 B 类。