如果 OuterClass类 中有实例变量的话,显然 NestedClass 是 不可见的,也是不适用的(因为它是类的一部分)。
这个时候,利用实例内置类可以解决这类问题。
示例代码如下:
package org.mercy.design;
/**
* OuterClass2 是外层类,InnerClass 实例内置类
*
* @author mercyblitz
*/
public class OuterClass2 {
private String message ;
/**
* 使用private final 是一种好习惯。:D
*/
private final class InnerClass {
/**
* 输出OuterClass2消息
*/
private void outputMessageFromOuterClass2 () {
// 注意,this的命名空间
System. out .println(OuterClass2. this . message );
}
}
}
代码 -2
在“代码-2 ”中, InnerClass 利用 OuterClass2 的 message 字段作为输出。
可能有人会说,InnerClass 这种实例内,为了得到这个类,不得不创建一个实例,太浪费 资 源 了, 为什么不直接把OuterClass 实例作为参数,直接传入到 InnerClass 的方法呢?
没错,可以那么做。不过单从访问外层类的实例变量而言,利用实例 内置类是有点显得 浪 费。 如 果 客 户端利用了泛型编程的话,情况就会不同。
总所周知, 泛 型设计能够提高灵活性,可是也有很多限制。模版参数类型是跟随其寄主类的, 模 板参数类型是不会写入class 文件中的,这就是为什么反射( Reflection )不能解析出类的模板参数类型。但是,模板参数类型在实例(对象)范围是可用的(或可视的) 。 如果内置类中想要利用外层类的模板参数类型的话,那么实例内置类就有很大用处。
例子如下:
package org.mercy.design;
/**
* OuterClass3 是外层类,InnerClass 实例内置类
*
* @author mercyblitz
* @param <T>
* 模板参数类型,实例内置类可以利用
*/
public class OuterClass3<T> {
private T data ;
/**
* 使用private final 是一种好习惯。:D
*/
private final class InnerClass {
public void setData(T newData) {
OuterClass3. this . data = newData;
// DOES Other things
}
}
}
代码 -3