- ベストアンサー
Javaでアルゴリズムのクラス分けについて
- Javaで実装したアルゴリズムをクラス分けする方法について質問です。
- アルゴリズムが大きなファイルになってしまったため、クラス分けを検討しています。
- クラス分けする際に、アルゴリズムの各項目からアクセスする必要がある変数が存在します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1の方が書かれている様にクラス型のフィールドは参照なので、そのまま返すだけなら、性能的なハンデは有りません。 また、一部のクラスにだけ公開したいメンバーが欲しいなら、パッケージプライベートを使うのが一般的でしょう。Javaではアクセス修飾子を付けなければ、パッケージプライベートとなります。 パッケージプライベートなフィールドやメソッドは同じパッケージのクラスからだけアクセスできます。 例) ------------------------------------ package aaa; public class Class1 { private Map<Object, Object> map; Map<Object, Object> getMap() { return map; } } package aaa; public class Class2 { public static void main(String[] args) { Map<Object, Object> map = new Class1().getMap(); // OK } } package bbb; public class Class3 { public static void main(String[] args) { Map<Object, Object> map = new Class1().getMap(); // コンパイルエラー } } ---------------------------------------- また、呼出し元によるMapに対する意図しない変更を防ぎたい場合は、java.util.Collections の unmodifiableMap を使う手も有ります。これも元のMapの要素数を気にする必要は有りません。 http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Collections.html#unmodifiableMap%28java.util.Map%29 例) ------------------------------------ return java.util.Collections.unmodifiableMap(map); ---------------------------------------- もっともMapのキーや値が可変クラスであれば、それに対しての変更は防げませんが。
その他の回答 (2)
- root139
- ベストアンサー率60% (488/809)
> jarの中のアクセス修飾子のついていないメンバについても > jarの中でだけアクセスできたりするのでしょうか? アクセス修飾子のついていないメンバはパッケージ内でプライベートという意味になりますので、同じjarの中であっても別のパッケージに属するクラスからはアクセスできませんし、別のjarであっても同じパッケージのクラスからはアクセスできます。 ただし、クラスローダーが違う場合などは、同じパッケージでもアクセスできないケースが出てくるみたいですが、例外的な事象ですので普通は気にする事は無いかと。
- hitomura
- ベストアンサー率48% (325/664)
1.でしょうね。 というか、JavaでネットワークやDBが絡まない話で > 変数は、HashMapの巨大な変数であるため、 > やりとりにコストがかかる。 というのはちょっと理解できないのですが……。 HashMapは参照型になるからメソッドでやりとりされるのは参照のはずで、そのやり取りでのコストは普通のクラスのやりとりと同じはずです。 ゲッターやセッターで(引数の渡し手や戻り値の受け取り手に内容を勝手に修正されることを嫌って) 引数や戻り値をcloneしているというのなら話は別ですが、あなたの質問されている状況では特にcloneする必要はなさそうに思います。
お礼
ありがとうございます。そのとおりですね。 何も考えずに、return HashMapみたいにやりとりすれば 参照なので、値は共有できますね。
補足
と思ったのですが、 そうすると、ゲッターやセッターをpublicにする必要があると思います。 そのアルゴリズムの内部では変数に自由にアクセスできるようにし、 かつ、外部からは、ゲッターやセッターも隠蔽したいのですが、 そのようなことは可能でしょうか?
お礼
ありがとうございます。 実はこのソースは最終的にはjarになるはずなのですが、 >パッケージプライベートなフィールドやメソッドは >同じパッケージのクラスからだけアクセスできます。 ひょっとすると、jarの中のアクセス修飾子のついていないメンバについても jarの中でだけアクセスできたりするのでしょうか?