人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javaのメソッドにおけるアクセス修飾子は、
同一クラス内である(private)か否か
パッケージプライベートである(なし,protected)か否か
サブクラスである(protected)か否かという単位でしか制限できませんよね

ということは、サブシステム間でクラスを共有する場合、相手のサブシステムに公開したくないクラスは必然的に同一パッケージに入れる必要があり、管理が難しくなると思いますが、実際現場ではどのようにされているのでしょうか。
また、私はサブパッケージであるか否かという、アクセス制御があれば、問題が解決できると考えますが、如何なのでしょうか。そして、他の言語にそのような概念があるものは存在するのでしょうか。

●質問者: houndyz
●カテゴリ:コンピュータ インターネット
✍キーワード:Java アクセス クラス サブクラス システム
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ma-kanoh
●27ポイント

>実際現場ではどのようにされているのでしょうか。

は、そもそもそんな難しいことは考えない。

相手のサブシステムに公開したくないクラスだろうがなんだろうが

関係なし。「みないことにしといて」という合意をとっただけでした。私のところは。

逆にFacedeパターンで完全隠蔽、というのもありましたが。

http://www.kmonos.net/alang/d/attribute.html

D言語には、まんま「パッケージ」(package)という概念があります。

「モジュールは違っても同じパッケージに属するコードからの アクセスは許可する」とのことなので合ってるのでは。

C#は、誰か解説してくれるに違いない。。。

◎質問者からの返答

>「みないことにしといて」という合意をとっただけでした。

なるほど。。。やはり割り切ってるんですね。

> D言語には、まんま「パッケージ」(package)という概念があります。

本当ですね。これがあるとカプセル化ができそうですね。ありがとうございます。


2 ● ikg
●27ポイント

http://www.hatena.ne.jp/

URLはダミーです。

私のいる現場での現状だけですが。


私のところではざっくりとした基準で制御する事が多いです。

#publicにしたところで、予想外のクラスから呼び出されるのはミスっている時だけなのが現状なので‥


>サブシステム間でクラスを共有する場合

publicにしてしまいます。


>相手のサブシステムに公開したくないクラス

同じパッケージにできない場合は『public』にしてしまいます。

ある程度防ぎたい場合には『なし』として、

同一パッケージのクラスのprotectedメソッドから呼び出させ、

そのクラスを継承させる、といった形をとったりもします。

(元々のメソッドのアクセス制御のためだけに、このような面倒な

やり方を取ることはありませんが‥)

◎質問者からの返答

> ある程度防ぎたい場合には『なし』として、

> 同一パッケージのクラスのprotectedメソッドから呼び出させ、

> そのクラスを継承させる、といった形をとったりもします。

なるほど、facadeと同じようなことを継承で行うのですね。

やはり、Javaではパッケージ間のアクセス制御を考慮して、

パッケージ構造を決めるより、クラスの意味的な整理として

割り切っているんですね。

貴重な情報ありがとうございます。


3 ● あーる
●26ポイント

http://www.atmarkit.co.jp/fjava/rensai3/devedge06/devedge06_...

URLはダミーです。

私のところも、基準無しに作成されてますね。

外から呼ばれるときは public で 呼ばれないときは private みたいな。^^;

あとは、「基本はリードオンリーオブジェクト」で、このオブジェクトにセットできる人は限られている場合に、 getterだけpublicにしたりしてますね。

(例えば Userクラス があって、使う人には読み込み専用で使わせて ファクトリー経由でしかこのUserクラスは作成させないとか。)


でも、ぶっちゃけ

public と private が90%ぐらい締めています。はい。


最近、

「Javaで作ってるけどオブジェクト指向じゃないなぁ」

って言葉をよく聞きますが、

まさにその通りだと思います。

◎質問者からの返答

> 使う人には読み込み専用で使わせて ファクトリー経由でしか作成させないとか。

なるほど、オブジェクトの生成を局所化させたい時は有効ですね。

> 「Javaで作ってるけどオブジェクト指向じゃないなぁ」

厳密なカプセル化ができない≠オブジェクト指向ではない

だと思うので、ちょっと行き過ぎだと思いますが、気持ちはわかります。

Javaはプログラムが複雑になってしまうキーワードを、排除するポリシーで作られているそうなので、アクセス修飾子を増やさない事を優先したのかもしれませんね。

皆さんのお話をまとめると、クラス内部のプロパティ、メソッドを外部に公開するか否かという点では、管理している。その上で、どうしても気になる所だけをある程度、カプセル化するということですね。

ただし、パッケージは、クラスを整理するための入れ物の役割もあり、この構造に悪影響を与えない範囲でされているといった所でしょうか。

愚問に対して有益なご意見ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ