- PR -

アクセス制限

1
投稿者投稿内容
初芽
会議室デビュー日: 2005/07/03
投稿数: 15
投稿日時: 2005-07-14 09:47
よろしくお願いいたします。

アクセス制限でprivate public protectedなどなどありますが、
A・Bからは書き換え可能で、Cからは閲覧、使用のみ可能な状態にするにはどのようにしたらよいのでしょうか。
finalをつけると、書き換え不可能になってしまいますし、
配列にfinalをつけても、内容は書き換え可能ですし、
何かと思いどうりにならないのですが…。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-14 12:06
A, Bが目的のクラスの派生クラスなら、protectedなメソッドでリストを返すようにする。
派生クラスでないのであれば、同一パッケージにしてpackage privateなメソッドにする。
Cに対しては、publicメソッドで書き換え不可能なリストを返すようにする。

変更不可能なリストの生成は、Collections#unmodifiableListを使うといいでしょう。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 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 ]
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-07-15 10:31
無理矢理やろうとすれば、アクセサメソッド内で認証を行うような処理を書けば...うわ、悪夢ですね。

StackTraceElementを調べれば「どのクラスから呼ばれたか」はわかりますし、
呼び出し元がthisやserialVersionUIDを渡して「身元」を明らかにするとか...。

いや、忘れてください。そんなプログラム組んじゃダメです(苦笑)
117
ベテラン
会議室デビュー日: 2005/05/09
投稿数: 94
お住まい・勤務地: 大阪府
投稿日時: 2005-07-15 12:10
素人考えですが
アクセス制限をインタフェースにしてアクセサメソッドに
呼び出し元の参照を与えさせるとか...
コード:

interface W{}
class Hoge
{
private int X;
public void setX(int value , Object o)
{
if (o instanceof W ){ this.X = value;}
else{ throw new Exception();}
}
}
で、呼び出し元で

Hoge hoge = new Hoge();
hoge.setX(100,this);


としたとき呼び出し元がWを継承してない場合例外発生.
[追記]
...と思ったのですが,this以外のインスタンスで偽装できるので
使えないですね. 忘れてください....
_________________
Future Is What We Are!

[ メッセージ編集済み 編集者: 117 編集日時 2005-07-15 12:21 ]
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2005-07-15 12:22
引用:

117さんの書き込み (2005-07-15 12:10) より:
素人考えですが
アクセス制限をインタフェースにしてアクセサメソッドに
呼び出し元の参照を与えさせるとか...
コード:
interface W{}
class Hoge 
{
  private int X;
  public void setX(int value , Object o)
  {
    if (o instanceof W ){ this.X = value;}
    else{ throw new Exception();}
  }
}





こうすればどのクラスからも自由にアクセスできますね。
コード:
Hoge hoge = new Hoge();
hoge.setX(100, new X{});



Javaの場合、アクセス制限はパッケージで分けて行うしかない気がします。
後は規約で縛るくらいですか。
1

スキルアップ/キャリアアップ(JOB@IT)