关于JAVA内部类的一些思考

四种内部类

Java中有四种内部类,静态内部类,非静态内部类,匿名内部类,局部类。

《Effectvie Java》中有一句话说的话,内部类存在的唯一唯一作用是为其外围类(enclosing class)服务。这是使用内部类的根本的立足点。

静态内部类和非静态内部类

​ 这2种内部类的区别在于,非静态内部类的实例,都拥有一个指向其外围类实例的引用。在大量应用的场合,非静态内部类就会存在大量指向外围类实例的指针,存在一定的资源浪费,当然这是相对的,在适合应用非静态内部类的场合,是不能摒弃非静态内部类的。只是我们应该有这么一个原则:能用静态内部类,就不要使用非静态内部类。

​ 立足于内部类的存在是为外围类服务的这一基本点,非静态成员类的一种常见用法是,允许外围类的实例被看做是另外一个不相关的类的实例。例如,Map接口的实现使用了大量的非静态成员类来实现它的一些视图,例如keySet,valueSet等。

举例说明用法:

​ 最近遇到这样一个需求,需要求2个特定日志之间所有的日期的年份和日。显然,从OOP的角度来看,我们需要把年份和日组合成一个对象,然后返回这个对象的一个集合。而这个对象所属的类,在其他地方是不需要使用到的,因此没有必要上升到一个顶层的外部类,故使用静态内部类最合适。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static class YearAndDay{
private int year;
private int day;

YearAndDay(int year,int day){
this.year = year;
this.day = day;
}
public void getYear(){
return this.year;
}
public void getDay(){
return this.day;
}
}

匿名内部类和局部类

​ 这两种类不细说,以后再补充。