重複の可能性:
プロパティとカプセル化
NEWBアラート!!
私はAndroidとJavaから始めて、それを理解し始めていますが、なぜパブリック変数だけでなくゲッターとセッターを使用する必要があるのか疑問に思っています。
多くの人がプライベート変数を作成し、getおよびsetメソッドを作成しているのを目にします。
ここでのアイデアは何ですか?
重複の可能性:
プロパティとカプセル化
NEWBアラート!!
私はAndroidとJavaから始めて、それを理解し始めていますが、なぜパブリック変数だけでなくゲッターとセッターを使用する必要があるのか疑問に思っています。
多くの人がプライベート変数を作成し、getおよびsetメソッドを作成しているのを目にします。
ここでのアイデアは何ですか?
その呼ばれるカプセル化と概念は、オブジェクト指向プログラミングの中心です。アイデアは、クラスの実装を非表示にし、コントラクトのみを公開することです。つまり、howを非表示にし、 whatのみを公開します。変数をプライベートにすることで変数を非表示にし、クライアントがクラスと通信するために呼び出すパブリックセッターゲッターやその他のパブリックメソッドを提供します。これらは、メソッドの実際の実装や変数の格納方法とは関係ありません。
たとえば、電話番号をLongオブジェクトとして保存した次のクラスがあるとします。
public class ContactInfo {
private Long phoneNo;
public Long getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(Long phoneNo) {
this.phoneNo = phoneNo;
}
}
クラスのクライアントにはゲッター/セッターしか表示されないため、電話番号の表現をPhoneNumberオブジェクトに切り替えることで、クラス/メソッドの実装を簡単に変更できます。ContactInfoのクライアントはまったく影響を受けません:
public class ContactInfo {
private PhoneNumber phoneNo;
public Long getPhoneNo() {
return phoneNo.getNumber();
}
public void setPhoneNo(Long phoneNo) {
this.phoneNo = new PhoneNumber(phoneNo);
}
}
public class PhoneNumber {
private Long number;
public PhoneNumber(Long number) {
this.number = number;
}
public Long getNumber() {
return number;
}
}
関連するOOPの概念は、カプセル化(google it)です。いくつかの利点は次のとおりです。たとえば、パブリックゲッターとプライベートセッターなど、セッター(ミューテーター)とゲッター(アクセサー)に異なるアクセスレベルを指定できます。もう1つの利点は、値の変更または取得以外の別のコードを追加できることです。たとえば、設定値の有効性を確認したり、変数を特定の値に変更したことに応答して例外をスローしたり、いくつかのイベントを発生させたりすることができます。これらをアクセサーまたはミューテーター内に実装する場合、クラス外のコードを変更せずに実装を変更することもできます。
アイデアは「情報隠蔽」だと思いますhttp://en.wikipedia.org/wiki/Information_hiding
また、変数へのアクセスを制御する役割も果たします(インターフェイスを提供します)。たとえば、ゲッターを提供することはできますが、セッターを提供することはできません。これにより、読み取りはできても書き込みはできなくなります。一方、すべてが公開されている場合は、変数の読み取りと書き込みが可能です。
また、変数を設定するためのチェック/検証の必要性も重要です。たとえば、String name
空にすることは許可されていないが、公開されている場合は、簡単に忘れて、として設定することができますname = ""
。あなたがそのようなセッターを持っているなら、あなたはsの長さをpublic boolean setName(String newName)
チェックnewName
して、それが合格して設定されているかどうかにかかわらずtrueまたはfalseを返すことができます
この概念はカプセル化と呼ばれます。
それが行おうとしているのは、クラスの内部構造をその振る舞いから分離することです。
たとえば、次のようなクラスがあるとします。
public class Point{
private float x;
private float y;
public float getX(){
return x;
}
public float getY(){
return y;
}
public float distanceToZero2(){
return x*x + y*y
}
public float getAngle(){
//havent considered the x = 0 case.
return atan(y/x);
}
public boolean isInFirstQuad(){
return x>0 && y>0;
}
}
この場合、カプセル化はクラスの内部構造を非表示にし、ポイントで使用可能な操作のみを公開します。気に入らない場合は、内部構造を変更して動作を維持できます(たとえば、カルテシアン座標を極座標に変更します)。
このクラスを使用するAnyouneは気にしないので、この機能を備えたPointクラスがあることを嬉しく思います。
カプセル化のほかに、場合によっては、変数のgetまたはsetの値を制御することもできます。たとえば、age
>=1である必要がある変数の値を検証するとします。
class Person {
private int age = Integer.MIN_VALUE;
public void setAge(int age){
if(age>=1)
this.age = age;
}
public int getAge(){
return age;
}
}