您的位置:首页 > 编程语言 > Java开发

Java基础 Java中关于内部类的小细节

2013-12-01 01:35 369 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

今天完成自己的事情后看了下老久前写的程序发现了个小问题便分享下

public class MyList<T> {

public T get(int index) {
if (index >= count) {
throw new IndexOutOfBoundsException();
}
return (T) arr[index];
}

public int size() {
return count;
}

public void add(T t) {
if (count == arr.length) {
Object[] temp = new Object[count * 2];
copyArr(arr, temp);
destroyeArr(arr);
arr = temp;
}
arr[count++] = t;
}

public Iterator<T> iterator(){
return new MyIterator();
}

class Component {
// 做些其他事情......
}

class MyIterator implements Iterator<T>{
int current_index = 0;
public boolean hasNext() {
return current_index != count;
}

public T next() {
T t = (T) arr[current_index++];
return t;
}

public void remove() {
throw new UnsupportedOperationException();
}

}

private void copyArr(Object[] source, Object[] desc) {
if (source != null) {
for (int i = 0; i < source.length; i++) {
desc[i] = source[i];
}
}
}

private void destroyeArr(Object[] arr2) {
for (int i = 0; i < arr2.length; i++) {
arr2[i] = null;
}
}

public Component getComponent(){
return new Component();
}

private Object[] arr = new Object[32];
private int count = 0;
}
这个类是可以正常工作的,但是大家应该注意到MyList类中定义了两个类,一个MyIterator,还有一个Componet,其中只有MyIterator用到了外围类的变量,Component类没有用到,这就是我想要说的问题,我们都知道,一个非静态内部类都默认持有对外围类成员属性的引用,保存这些引用需要时间和空间,而且会导致外围实例在符合垃圾回收时却仍然得以保存,而得不到及时的垃圾回收。如果没有用到这些属性,这样做好像有点不好。所以,如果内部类没有用到外部类的成员属性则不要使用费静态内部类!
代码中将Component定义成静态内部类就好了,如下:

public class MyList<T> {

@SuppressWarnings("unchecked")
public T get(int index) {
if (index >= count) {
throw new IndexOutOfBoundsException();
}
return (T) arr[index];
}

public int size() {
return count;
}

public void add(T t) {
if (count == arr.length) {
Object[] temp = new Object[count * 2];
copyArr(arr, temp);
destroyeArr(arr);
arr = temp;
}
arr[count++] = t;
}

public Iterator<T> iterator(){
return new MyIterator();
}
// 改成静态内部类
static class Component {
// 做些其他事情......
}

class MyIterator implements Iterator<T>{
int current_index = 0;
public boolean hasNext() {
return current_index != count;
}

public T next() {
T t = (T) arr[current_index++];
return t;
}

public void remove() {
throw new UnsupportedOperationException();
}

}

private void copyArr(Object[] source, Object[] desc) {
if (source != null) {
for (int i = 0; i < source.length; i++) {
desc[i] = source[i];
}
}
}

private void destroyeArr(Object[] arr2) {
for (int i = 0; i < arr2.length; i++) {
arr2[i] = null;
}
}
public Component getComponent(){
return new Component();
}

private Object[] arr = new Object[32];
private int count = 0;
}


OK,就这么些了,是我以前没有注意的,给大家分享分享,高手请轻拍!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: