2012-06-22 10 views
5

Point(x、y)オブジェクトの一般的な例を使用して、Java 1.4で構造体として使用する方法はありますか?利点は、構造体が含まれているオブジェクトの一部であるため、Pointオブジェクトに別々のメモリ割り当てがないことです。しかし、それはまだそれにアクセスするためのメンバ関数を持っています。Java 1.4で構造体に相当する方法がありますか?

私は答えはノー希望スプリング永遠けど...

何/理由で98%確信している:私たちのコードでは 我々は10万個の以上のオブジェクト持っている(約12 - 総メモリフットプリントの14%)これはintとbooleanです。それがオブジェクト内のC#構造体だった場合は、オブジェクトの数が減ります。そして、0x40000000がブール値であるintを単なるものにしようとしています。しかし、私たちがそのintのメンバメソッドを持っていてそれが構造体として扱われているなら、それを扱う方がずっと簡単です。

+0

あなたはメモリ割り当てについて心配しています...あなたは "新しい"を使用していることを意味しますか? –

+1

Javaの "構造体"とは何かを記述するサンプルコードを提供できますか? –

+0

あなたはC#構造体に相当するのですか?値の型、参照がない場合はnullにできません。ガベージコレクタにヒットしませんか? –

答えて

1

いいえ、一般的な "構造体"にはObjectを使用する必要があります。

しかし、intのペアのような単純なデータ構造の場合、メモリを節約して速度を向上させるために細かいことができます。

int a = 9; 
int b = 10; 
long pair = (a << 32)|b; 

これはlongabの32ビットをパック。ここでは、あなたがそれらを抽出方法は次のとおりです。

a = (int)(pair >> 32); 
b = (int)pair; 
1

tskuzzy's answerに加え:別の可能性は、ポイント値を格納する必要がある任意のクラスにPointクラスからint xint yフィールドを持ち上げることであろう。コメントへの応答で

編集:あなたができる

ことの一つは、単一のポイント値がPointクラスを拡張格納する必要がある各クラスを持つことです。論理的なis-a関係はありませんが、1つのインターフェイスでPointオブジェクトにアクセスできます。しかし、これは、複数のポイント値を格納する必要があるクラスでは機能しません(私はそうは思わない)。

+0

それは私たちがやっていることです。しかし、我々はクラスでこれらの束を持っているので、すべてが乱雑になります。私はオブジェクトインターフェイスの清潔さを失うことが嫌いです。ああ、人生は不完全です。 –

+0

いいインターフェースを持つオブジェクトを書くことはできますが、よりメモリ効率の良い実装を使います。 –

2

私は彼らが将来のバージョンのために暗示されていると信じていますが、Javaに構造体等価物はありません。まだフライウェイトパターンを見て、あなたが探しているかもしれないhttp://en.wikipedia.org/wiki/Flyweight_pattern

+0

残念ながら、これらはすべて異なる値を持っています。または、より正確にするために、いつでもそれぞれ異なる値に設定することができます。 –

+0

パターンでは、オブジェクトは不変であると言われますが、プールから新しいオブジェクトを取得することによってオブジェクトへの参照を変更することができます。ほとんどの100k +オブジェクトは異なりますか?別にプール可能なパーツにリファクタリングすることはできませんか? – ilcavero

+0

それはおそらく数百のプールになります。しかし、それは各セットがマップの検索と割り当てになるので問題を動かします。私は、プリミティブを直接格納し、それを操作する静的メソッドを持つよりも悪いと思う。私が書いたコードは、ちょうど構造体で手に入れることができるように、オブジェクト指向のものであった。 –

関連する問題