- 締切済み
javaのprivateって?
privateの必要性がいまいちわからなくて困ってます。 class Car{ private int num; private double gas; public void setNumGas(int n, double g){ num=n; gas=g; ・・・・・・・ このようなプログラムがあります。 変数をprivateにして、下のメソッドでnの値をnumに格納してします。 ここで変数をprivateにする意味ってあるんですか? 本には、勝手な値(-10など)を代入させないためと書いてあります。 これっておかしくないですか? 変数をprivateにしてもメソッドに「-10」を引数として渡したら余裕で格納できるじゃないですか。 代入させないためと書いてあるのに格納できるって・・・・矛盾してるような気がします。 ここでprivateにする意味がわかりません。 誰か教えてください。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Sugichi28
- ベストアンサー率75% (3/4)
ほかの皆さんのアドバイスとほぼ同じですが、要するに、とても大切なデータにはprivateをつけるってところでしょうか。 class sample{ // 消費税の変更を許可するかどうかのフラグ変数 private boolean allow = false; // 消費税 private int tax = 0.05; public void changeAllow(int yes){ // 引数の値が1ならallowをtrueに変更 if(yes == 1){ allow = true; }else{ allow = false; } } public void changeTax(int new_tax){ // allow(許可)変数がtrueなら新しい消費税を設定 if(allow == true){ tax = new_tax; }else{ System.err.println("消費税の変更は許可されません。"); } } } 上のサンプルでは、消費税という変数をプライベートにしています。実生活で考えてみてください。たとえば、allow(消費税の変更許可を制御)という変数は財務省しか操作できない重要な値です。一般人(public)が勝手に許可できないですよね?だから、privateにしておいてメソッドでチェックします。 そして同じくtax(消費税)というのも、勝手に変えては経済が混乱します。なので、allowがtrueになった場合、つまり財務省が許可した場合のみ変更を許可します。どうでしょう。お分かりになったでしょうか。自分も習いたてのころはprivateの必要性には頭を抱えました。でも、とても重要な概念ですのでがんばって理解してくださいね。
- freedom560
- ベストアンサー率46% (80/173)
privateとは以下のような概念です。 Aさんはprivateな変数moneyを持って、それをセットするメソッドを用意しています。 class A { private int money; public void setMoney(int money) { this.money=money; } } Bさんはpublic な変数moneyを持っています。 class B { public int money; } Aさんはお金を金庫か何かに入れてきちんと管理している。Bさんはお金を家の玄関の前において管理しているようなイメージです。 AさんもBさんも1千万円持っていたとします。 a.money=10000000; b.money=10000000; ここで、あるXさんが、AさんとBさんのmoneyを奪おうとします。すると、Bさんの変数moneyはpublicなので、Xさんが好きなように使うことができます。 b.money=0; だろうが、 b.money=-10000000; だろうが、Xさんは自由に操作できるわけです。 しかし、Aさんの変数moneyはprivateなので、Xさんが好きなように使うことはできません。(クラスXでa.moneyを書くとコンパイルエラー)つまり、一度AさんのsetMoneyメソッドにお伺いをたてることになります。しかし、AさんのsetMoneyメソッドが今のままだったら、今質問者さんが考えているようにbさんのそれとあまり違いはありません。しかし、AさんのsetMoneyメソッドが public void setMoney(int money) { if(money>this.money) this.money=money; } というメソッドだったらどうでしょう?XさんはAさんのmoneyを増やすことはできても減らすことはできないのです。(引数が現在の値より大きいときにはじめてセットできるようになるから) 変数をprivateにしてセッターゲッターを用意しておくことにより、このような効果を簡単にもたらすことができます。これが「勝手な値を代入させない」と言う意味です。 お金を金庫に入れて管理するか、玄関の前において管理するか。どちらを使っても文法的には問題ないのですが、Javaではお金を金庫に入れて管理する方法の方が推奨されています。
- Lv1-suraim
- ベストアンサー率0% (0/0)
privateでない変数は、他のクラスから直接値を格納できます。 例えば以下のようなクラスが有ったとします。 public class A{ int num; public void setNumGas(int n){ } } 例えばの話ですが、このclass A の変数 num には マイナスの値を格納したくないとします。 しかし、この変数 num は別のクラスから 以下のようにして値を格納できます。 public class B{ public static void main(String[] args){ A a =new A(); a.num = -10; } } この方法で値が格納されると、格納された値はマイナスなのか プラスなのかが分からないまま、値が格納されてしまいます。 そこで class A の変数 num を以下のようにします。 class A{ private int num; public void setNumGas(int n, double g){ } } これでもう先ほどのような方法で変数numには値を格納できません。 他のクラスが変数 num に値を格納するためには class A に 以下のようなメソッドを用意してあげるしかありません。 public void setNumGas(int n){ num = n; } 変数 num に値を格納するときには必ずこのメソッドを 通らないといけなくなったので、このメソッドに 「これから変数 num に格納する値はマイナスなのか プラスなのか確認」するプログラムを書けば 変数 num に勝手な値を入れられる心配はありません。 class A も class B も同じ人が書くのであれば privateを使わなくても変数 num にマイナスが 入らないよう注意するだけでいいのですが 実際に会社でjavaのプログラムを書く時、class A と class B は 別々の人が書いたりしますので、このほうが安心です。 まあ、変数 num にマイナスが入らないようにチェックする 方法は他にもありますが、この方法が一番スマートな気がします。 なぜなら class B 以外に class A にアクセスするのクラスを 作成したとしても、class A の変数 num に値を格納するためには 必ず「これから変数 num に格納する値はマイナスなのか プラスなのか確認」メソッドを通るようになるからです。
- neko_noko
- ベストアンサー率45% (146/319)
>変数をprivateにしてもメソッドに「-10」を引数として渡したら余裕で格納できるじゃないですか。 >代入させないためと書いてあるのに格納できるって・・・・矛盾してるような気がします。 本来、代入させないための処理をsetNumGasに書きます。 ただ、入門書などの場合、そこまで書くとコードが長くなって分かりづらいので省略してあるのでしょう。 こういうsetXXXメソッド(アクセサと言います)を使用しておけば、 numやgasを使用する時にいちいち値が問題ないかをチェックする必要がなくなります。 numやgasがどこで使用されるかなんてのは予測できないし、どれくらい使用されるかも分かりません。 その都度チェックするくらいなら、「入り口」を作っておいてそこで一回チェックし、 ちゃんとした値以外は入らないようにしておく方が効率的で安全です。 また、別の考え方として、入り口の「入り方」をあえていくつか用意するテクニックもあります。 例えば、JavaにはURLをあらわすURLクラスというものがあります。 クラス内で URL url という変数があった場合に setUrl(URL url){ ・・・ } setUrl(String url){ ・・・ } という2つのアクセサを用意しておけば、urlがURL型であろうとString型であろうと、 setUrl(url)を使用すれば値の代入が可能になるわけです。 そのクラスを使う側がいちいち変換しなくても済むわけです。 ※もちろん、setUrl(String url)の中で、String型のurlをURL型に変換する処理を書きます。 どうしてもprivateが使いたくないなら止めはしませんが、 Javaの常識として、クラス変数はprivateとし、メソッドから値を操作する、というのがあります。 なので、作ったクラスを他の人が使用する可能性があれば、その旨は周知させておかないといけません。 「何でわざわざprivateにしておかないの?」と言われるかもしれません。
- Bonjin
- ベストアンサー率43% (418/971)
>本には、勝手な値(-10など)を代入させないためと書いてあります。 >これっておかしくないですか? おかしくないです。提示されたコードでは確かに格納されてしまいますが、適切なコードを加えることでチェックをすることが出来るという意味です。例えば負数がnもgも負の値がダメな時は public void setNumGas(int n, double g){ if(n < 0 || g < 0){ throw new IllegalArgumentException(); } ~省略~ } の様に例外を起こしたりできると言うことです。
じゃぁもし Carの内部仕様が変更されたらどうするの? 今は判るから num や gas を直接参照して class Car x; x.gas=-10; 等と出来るかもしれないけど gas でなく energy に仕様変更されたらどうするの? ソースの全てを書き換えるの? なら x.setNumGas(1,-10) のような方法で使わせ x.gas という使用方法を禁止しておいた方が良いと思わない? 開発者が使うなら構わないけど 別の人がそれを使う場合はどんな内部仕様修正があろうとも x.setNumGas(int,double) でclassを使用できる。
補足
すいません。java初心者なので理解に苦しみます。 もっとわかりやすく簡単に説明してください。