- - PR -
アクセス制限
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-14 09:47
よろしくお願いいたします。
アクセス制限でprivate public protectedなどなどありますが、 A・Bからは書き換え可能で、Cからは閲覧、使用のみ可能な状態にするにはどのようにしたらよいのでしょうか。 finalをつけると、書き換え不可能になってしまいますし、 配列にfinalをつけても、内容は書き換え可能ですし、 何かと思いどうりにならないのですが…。 | ||||||||||||
|
投稿日時: 2005-07-14 12:06
A, Bが目的のクラスの派生クラスなら、protectedなメソッドでリストを返すようにする。
派生クラスでないのであれば、同一パッケージにしてpackage privateなメソッドにする。 Cに対しては、publicメソッドで書き換え不可能なリストを返すようにする。 変更不可能なリストの生成は、Collections#unmodifiableListを使うといいでしょう。 | ||||||||||||
|
投稿日時: 2005-07-14 19:25
uk さんが書かれたことと重複するかもしれませんが、あるクラス X のフィールド f が A, B からは更新可能、C に対して参照のみ可能なアクセス権限設定を模索されているのでしたら、それはやめて必ずアクセッサメソッドを経由させるようにすべきだと考えます。
理由はデータの隠蔽性です。 他クラスから更新可能なフィールドがあるというのは、クラス設計に不備がある気がしてなりません。 (あくまで一般の場合です。特定の場合によっては、package private にして同一パッケージ内からの直接アクセスを認める方法を採ることもあるかもしれません。) # 私の経験上では、フィールドに対してこれを許したことはありません。 # アクセッサメソッドのアクセス権限を protected にしたり package private にしたりして範囲外からの呼び出しを排除したことは多々ありますが。 A, B からは X.setF(), X.getF() が呼び出せるが、C からは X.setF() の呼び出しを禁止するという開発規約で対応できそうですがいかがでしょう。 パッケージや継承構造によってはアクセッサメソッドのアクセス権限を用い、違反があった時には IDE (Eclipse 等) やコンパイラがメッセージを出せるようにする方法も可能です。 その一方で、A, B, C が X に対して同一パッケージや継承関係にある等の条件がない一般の場合では、アクセス権限だけでご提示の状態を実現するのは無理だと思います。 [ メッセージ編集済み 編集者: Gio 編集日時 2005-07-14 19:27 ] | ||||||||||||
|
投稿日時: 2005-07-15 10:31
無理矢理やろうとすれば、アクセサメソッド内で認証を行うような処理を書けば...うわ、悪夢ですね。
StackTraceElementを調べれば「どのクラスから呼ばれたか」はわかりますし、 呼び出し元がthisやserialVersionUIDを渡して「身元」を明らかにするとか...。 いや、忘れてください。そんなプログラム組んじゃダメです(苦笑) | ||||||||||||
|
投稿日時: 2005-07-15 12:10
素人考えですが
アクセス制限をインタフェースにしてアクセサメソッドに 呼び出し元の参照を与えさせるとか...
としたとき呼び出し元がWを継承してない場合例外発生. [追記] ...と思ったのですが,this以外のインスタンスで偽装できるので 使えないですね. 忘れてください.... _________________ Future Is What We Are! [ メッセージ編集済み 編集者: 117 編集日時 2005-07-15 12:21 ] | ||||||||||||
|
投稿日時: 2005-07-15 12:22
こうすればどのクラスからも自由にアクセスできますね。
Javaの場合、アクセス制限はパッケージで分けて行うしかない気がします。 後は規約で縛るくらいですか。 |
1