アプリ版:「スタンプのみでお礼する」機能のリリースについて

java習い始めのド素人です。
可視性にはpublic,protected,private,package(指定なし)があることはわかったのですが、その必要性がわからないです。
どのようなときにどれを使えばいいのか具体的なシチュエーションを教えて欲しいです。

A 回答 (7件)

今まで無回答ということは、たぶん、みんなあきれてるんですよ。

私同様。まず、public,protected,private,package,(default)は、可視性(visiblity)の概念ではなく、アクセス制御です。まず、基本的なJava本を読むべきですし、またこれらの真価は、ご自分の開発経験を通じて納得することになるでしょう。また、Java Coreライブラリのソースコードをはじめ、いろんな実物コードを見て勉強することをおすすめします。
    • good
    • 0

あきれているわけでもないのですが静観していた一人です。


結局、こういうものがなくて苦労したことがない人に、いきなりこういう概念を与えられても、その嬉しさというのはなかなか分からないのかなあ、と思います。習うより慣れろだと思いますよ。

ちなみに、#1さん、これは「可視性」ではないのですか???私はずっと可視性だと思っていました。
http://www.seshop.com/genba/yazawa/archives/09.asp
http://www.ibm.com/developerworks/library/ws-tip …
    • good
    • 0

可視性とアクセス制御の違いは(少なくともJavaでは)よく分からないけど、


その必要性を説明しろと言われれば、

携帯のダイヤルボタン(0~9、#、*)は押しやすい。
電源ボタンは、長押ししないと電源Offできないのでやや押しづらい。
リセットボタンは隠れていて(普通は)押せない。

これが基本的な考え方。
なんで押しやすさに差があるか?
これを踏まえてJavaの本をもう一回読めばちょっとは分かるかもしれない。
    • good
    • 0

Visibleとは、単純名(前にドット連結のない単一名)がスコープ内であることと、そのスコープ内で(同名のローカル変数などによって)日陰者(shadowing)になっていない状態を指します。



private, public等のアクセス制御は、みなさま体験的にもご存じのとおりです。

参考URL:http://java.sun.com/docs/books/jls/third_edition …
    • good
    • 0

可視性という表現は、決して間違いではありませんよ。


UML用語ですから。UMLの可視性を具体的にプログラミング言語
であるJavaで実現しようとすると、public,protected等の
アクセス制御によって具現化するということです。

例えば、UMLのオペレーションの具体的な実現方法が、
Javaでは、メソッドやコンストラクタを使いますし、
C++では、メンバ関数という方法によって具象化したりするということです。


そこで本題ですが、可視性は基本的に低くするべしとされます。
可視性を下げる唯一の目的は、バグの入る込む可能性を下げるためです。
これは、直感的にも解るでしょう。とはいいつつも、可視性が低すぎて
融通が利かないというような自体も生じますし、アクセスのための
手続きは煩雑になりアクセスのオーバーヘッドは大きくなります。
ですから、基本的には上記2つのトレードオフです。
トレードオフ問題ですから、そう簡単には結論が言える問題ではありません。

具体例を上げてみても初心者の人には理解できるかどうか疑問なので
省略しますが、疑問をもたれて具体的に質問されるという時点で、
多くのプログラマーよりも優れているといえるでしょう。

何しろ、可視性に関して具体的に説明できる人が少なくともここにはいないんですから。

私にも、初心者の人に可視性を具体例を挙げて理解させてあげるだけの
能力は残念ながらありません。
    • good
    • 0

>どのようなときにどれを使えばいいのか


>具体的なシチュエーションを教えて欲しいです

これは、なかなか文章では難しいです。
アクセス制御は、バグ対策が主な目的です。

アクセス制御のありがたさは、
短いプログラムでは、あまり感じられない事でしょう。

つまり、クラスをたくさん作るようなプログラムにおいて
特に価値があります。

なのでここでは、アクセス制御の使い方の例を紹介します。

private:基本的に全てのメンバ変数は、
    private指定にしておくべきでしょう。
    privateなメンバ変数を、
    他のクラスから書き換えたいのならば、
    それ専用のメソッドを用意しましょう。
    これは、めんどくさく感じますが、
    他のクラスから、
    全てのメンバ変数にアクセスするわけではありません。

protected:これは、親クラスを継承した、
     子クラスでアクセスする変数に対して使います。
     当然、親クラスを継承していないクラスからは、
     アクセスできません。

しかし、Javaのprotectedは、C++と違って同じパッケージの中なら、どのクラスからでもアクセスできるので、私は、変な仕様だと思っています。

public:ちゃんと作ればpublicを使用する機会は、
    あまり無いでしょう。
しかし、プログラム全体で利用する定数を定義する時に使えます。
   例えば、定数のみを定義したクラスを作った時などです。
    そもそも変数に対するアクセス制御は、バグを防ぐためです。
    しかし、定数は書き換えが出来ませんから、
    この場合は、問題ないわけです。

    ちなみに定数は、final指定子をつければ実現可能です。     public final int MAX_NUM = 5;

    また、public指定により、
    違うパッケージからでもアクセスできます。

package(指定なし):ご存知でしょうが、
         同じパッケージ内のクラスならアクセスできます。

----------------------------------------------------------------
以上を総合して考えると、

ryunan_198さんが、必要性がわからないとおっしゃるのも
わかる気がします。特にprotectedの仕様が疑問です。

個人で、趣味や学習で作る程度ならば、
private以外は、事実上大差がありません。

仕事や、個人でも大規模なプログラムを作る時には、
重要になってきます。
    • good
    • 0

> 可視性という表現は、決して間違いではありませんよ。


Javaという文脈では、間違いです。Javaでは、可視性(visiblity)はパッケージの正しい理解にもつながってくるので、UMLの意味(というか、要するによその村の意味)で理解すべきではありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!