【问题标题】:Question about using ArrayList in Java?关于在 Java 中使用 ArrayList 的问题?
【发布时间】:2010-07-18 12:31:20
【问题描述】:

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

我有两个选择: 选项 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();
   }
}

我应该使用哪个选项?

【问题讨论】:

  • ArrayList.toArray 返回的数组实际上的运行时类型为Object[]。投射它可能会产生意想不到的后果......

标签: java arraylist


【解决方案1】:

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

您的代码还有许多其他的 cmets。

首先,最好使用program to an interface, not an implementation - 将A 类中的成员变量BList 设为List&lt;B&gt; 而不是ArrayList&lt;B&gt;。此外,成员变量应该是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);
}

【讨论】:

  • 谢谢,这对我很有用。我已经修改了:)
【解决方案2】:

无论哪种方式,我都没有强烈的偏好。但是,我注意到您使用数组来返回列表的内容,可能是为了使其不可变。我建议改为使用Collections.unmodifiableList

【讨论】:

  • 好基本的想法。我更喜欢 Google 的 Guava 不可变集合对象,因为它们是为泛型类型安全而设置的。
【解决方案3】:

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

如果不是(例如,只有 Facade 计入公共接口),那么 没关系

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

【讨论】:

  • A 类实际上是对用户隐藏的,GUI 将直接与外观类交互
【解决方案4】:

除非您也确实需要,如果某些东西的原生格式是 bytes[] 用于图像之类的东西,则应该始终在 API 中为许多东西而不是数组返回 Collection 类型。在您的情况下,使用 Collections.unmodifiableXXX( ...) 包装原始 Collection。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2014-10-09
    • 2010-12-01
    • 2011-09-06
    相关资源
    最近更新 更多