Java安全返回类型容器

时间:2016-10-18 02:08:55

标签: java arrays collections

我白天是c ++开发人员,我习惯了const返回类型的约定。我知道java中没有类似的设施。

我有一个特定的情况,并想知道我的任务最好的不可变集合。在C ++中,我只使用std :: vector。

我有一个当前有float []数据的WavFile类,我想用可能不可变的东西替换它。

关于容器的一些重要规定是它的大小在创建时是已知的,并且它根本不需要动态增长或缩小。其次,应该是O(1)来索引容器。

最重要的是,就像主题所暗示的那样,我希望能够拥有一个返回此容器的不可变版本的getter。

我要找的容器类型是什么?这是java中可能出现的吗?

2 个答案:

答案 0 :(得分:2)

如果你能承受拳击费用,Collections.unmodifiableList()Guava ImmutableList将有效。

如果没有,请尝试Trove,其中提供TFloatArrayListan easy way to make them unmodifiable

答案 1 :(得分:0)

恕我直言,最好通过设计解决问题。返回一个集合或数组,即使它是const,仍然不能令人满意的OO设计,因为你暴露内部数据(尽管没有公开成员变量那样糟糕)。

您可以进一步考虑人们应该如何使用这些数据。

如果您希望人们只是遍历每个数据点,那么您可能会提供类似

的内容
public class WaveFile {
    public DoubleStream dataStream() {...}
    public forEachDataPoint(DoubleConsumer consumer) {...}
}

如果您真的想让人们随机访问,您可以提供

public class WaveFile {
    public float dataPointAt(int index) {...}
    public DoubleStream dataStream(int fromIndex, int toIndex) {...}
}

这种封装避免了许多意外的数据使用方式,并为您在内部表示数据提供了很大的灵活性。例如,你可以从磁盘上的文件进行延迟加载,你可以制作一个" WaveFile"其中的数据点是通过某些公式等生成的。