关于在Java中使用ArrayList的问题?

时间:2010-07-18 12:31:20

标签: java arraylist

我真的不知道标题是否合适。

我有两个选择: 选项1:

Class A {
   ArrayList<B> BList = new ArrayList<B>();

   public B[] getBList() {
       return (B[])BList.toArray();
   }
}

Class Facade {
   public B[] getAllB(){
       A a = new A();
       return a.getBList();
   }
}

选项2:

Class A {
   ArrayList<B> BList = new ArrayList<B>();

   public ArrayList getBList() {
       return BList;
   }
}

Class Facade {
   public B[] getAllB(){
       A a = new A();
       ArrayList BList = a.getBList();
       return (B[])BList.toArray();
   }
}

我应该使用哪个选项?

4 个答案:

答案 0 :(得分:3)

使用集合类,除非您有特定的理由使用数组。所以,我选择选项2。

可以对您的代码做出许多其他评论。

首先,最好program to an interface, not an implementation - 将班级BList中的成员变量A改为List<B>而不是ArrayList<B>。此外,成员变量应为private(除非有充分的理由使它们不是private)。第三,尽可能使用泛型 - 为什么你的方法getBList()会返回原始ArrayList? Java中变量的事实命名标准是camel case,从小写字母开始。所以不要调用成员变量BList,而是bList(或其他一些更好的名字)。

class A {
    private List<B> bList = new ArrayList<B>();

    public List<B> getBList() {
        return bList;
    }
}

课程Facade是否真的有必要返回B[]

要考虑的另一点是让您的类A不可变,因为如果您从A对象获取列表,然后从列表中添加或删除元素,则可能会发生意外情况(您的A对象中的列表也将被更改,这可能会令人困惑)。您必须在getBList()方法中返回列表的只读视图:

public List<B> getBList() {
    return Collections.unmodifiableList(bList);
}

答案 1 :(得分:1)

无论如何,我都没有强烈的偏好。但是,我注意到你正在使用一个数组来返回列表的内容,也许是为了使它不可变。相反,我建议使用Collections.unmodifiableList

答案 2 :(得分:0)

我认为唯一的区别是A类是否是组件公共接口的一部分。

如果不是(例如只有Facade计入公共界面),那么无关紧要

如果A类是公共接口的一部分,我会使用选项1。

答案 3 :(得分:0)

除非你真的需要,否则某些东西的原始形式是像图像这样的东西的字节[],应该总是在API中为许多东西而不是数组返回Collection类型。在您的情况下,使用Collections.unmodifiableXXX(...)包装原始Collection。