2016-10-18 11 views
0

私は日々C++の開発者であり、const戻り型の規約に慣れています。私はjavaにこれに類似した施設がないことを認識しています。Javaセーフ返却型コンテナ

私は特定の状況があり、私の仕事にとって最も不変なコレクションが不思議でした。 C++ではstd :: vectorを使用します。

私は現在浮動小数点[]データを持つWavFileクラスを持っていますが、これを不変である可能性のあるものに置き換えたいと思います。

コンテナに関するいくつかの重要な規定は、作成時にそのサイズが分かっており、動的に拡大または縮小する必要がないことです。次に、コンテナにインデックスを付けるには、O(1)にする必要があります。

さらに重要なのは、トピックのように、私はこのコンテナの不変バージョンを返すゲッターを持たせたいと思っています。

私が探している容器のタイプは?これはjavaで可能なことですか?

+0

'float []'配列。 Javaジェネリックスをベースにしたコレクションは、ストレージの量、および参照の局所性に関するさらに大きなオーバーヘッドの点でオーバーヘッドが大きくなります。要件を満たす独自のコンテナを作成します。ゲッターは発信者のためにあなたの配列の守備的なコピーを作るべきです。 – dasblinkenlight

+0

私は設計によって内部データを公開しないようにするより良い方法だと思います。内部データを公開するのではなく、単に各フロートを繰り返し処理するだけの目的なら、 'DoubleStream getDataStream()'または 'void forEachDataPoint(DoubleConsumer consumer)'を公開するのはなぜでしょうか?人々が何らかのランダムアクセスを行うことを期待している場合は、 'float dataPoint(int index);のようなものを公開することもできます。 float [] dataPoints(int from、int to); –

答えて

2

ボクシングコストで暮らすことができる場合はCollections.unmodifiableList()またはGuava ImmutableListとなります。

an easy way to make them unmodifiableを提供するTroveを試してください。

+0

第2に、コンテナにインデックスを付けるにはO(1)でなければなりません... " - あなたの提案はいずれも遵守していますか? – MordechayS

+1

@MordechayS - java.util.ArrayListは、配列を使用して実装されています。私たちはO(1)の時間にインデックスを付けることができます... 'arrayList.get(/ * int index * /);' – wfunston

+0

@wfunstonありがとう!では、Trove APIだけが有効な回答ではないのですか? – MordechayS

0

IMHO、この問題に対処することをお勧めします。 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」を作成することができます。

+0

同意しない。 「内部データを公開する」ゲッターを使ってintを返すか? constベクトルを返すのは良い設計です。何がうまくいかないでしょうか? – ScottF

+0

これは実際に問題です。なぜなら、何か行動を起こすのではなく、データを提供するものとしてオブジェクトを見ているからです。 「getterは常に間違っている」というゴールデンルールではなく、たとえば値オブジェクト(実際にデータを提供することを目的とする)などの場合があります。 getter/setterを使用すると、publicメンバーvarよりは優れていますが、適切なカプセル化とはまだまだ離れています。 –

+0

私はこの有名な議論がOOPの開発者が知っているべきことであり、両者の背後にある理由を理解する必要があると思います。http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods -are-evil.html –

関連する問題