publicとprivate、結局どう使えばいいの? と思われているかもしれません。
実はパターンがあるんです。
GetterとSetter
publicとprivateには「基本的な使い方」があります。
それは「フィールドはprivate」「メソッドはpublic」というものです。
/**
* GetterとSetterを持つ、標準的なクラス。
*/
class GetterAndSetter
{
// int型変数のフィールドです。privateです。
private int data;
/**
* フィールドの値を取得します。
*/
public int getData()
{
return data;
}
/**
* フィールドに値を入れます。
*/
public void setData( int param )
{
data = param;
}
}
/**
* 実行用クラス。このクラスを実行してください。
*/
class GetterAndSetterRunner
{
public static void main( String[] args )
{
// GetterAndSetterクラスの参照型変数とインスタンスを作ります。
GetterAndSetter ref = new GetterAndSetter();
// Setterを使って数値を入れます。
ref.setData( 100 );
// Getterを使って数値を取り出します。
int i = ref.getData();
System.out.println( i );
// 出力結果:
// 100
}
}
// GetterAndSetterRunner.java /** * GetterとSetterを持つ、標準的なクラス。 */ class GetterAndSetter { // int型変数のフィールドです。privateです。 private int data; /** * フィールドの値を取得します。 */ public int getData() { return data; } /** * フィールドに値を入れます。 */ public void setData( int param ) { data = param; } } /** * 実行用クラス。このクラスを実行してください。 */ class GetterAndSetterRunner { public static void main( String[] args ) { // GetterAndSetterクラスの参照型変数とインスタンスを作ります。 GetterAndSetter ref = new GetterAndSetter(); // Setterを使って数値を入れます。 ref.setData( 100 ); // Getterを使って数値を取り出します。 int i = ref.getData(); System.out.println( i ); // 出力結果: // 100 } }
GetterAndSetterクラスは、1つのフィールドと2つのメソッドを持つクラスです。
まず、フィールドが1つあり、これがprivateになっています。
private int data;
// int型変数のフィールドです。privateです。 private int data;
このprivateという点が重要です。
フィールドは通常、privateにします。
これから少しずつ説明しますが、実は、クラスにとって「クラスの外」は危険地帯です。何らかの危害を加えられる可能性があります。
そういった危険から「内部データ」、つまりフィールドを守る必要があります。フィールドをがっちり守って、外から勝手に値を変えられないようにしなければいけません。
そのために、ほとんどすべてのフィールドはprivateにするわけです。
フィールドをprivateにする代わりに、フィールドとデータの入出力をするためのpublicメソッドを用意します。
まず、フィールドから値を取得して返すメソッドを作ります。
* フィールドの値を取得します。
*/
public int getData()
{
return data;
}
/** * フィールドの値を取得します。 */ public int getData() { return data; }
このgetData()メソッドは、dataフィールドから値を取得して返すだけのメソッドです。
この「フィールドから値を取り出して返すメソッド」を「Getter」(ゲッター)と言います。
メソッド名の作り方はルールが決められていて、「getフィールド名」という名前にします。ただし「フィールド名」の所は頭文字を大文字にします。なので、「data」フィールドのGetterメソッドは「getData」というメソッド名になります。
同じように、フィールドに値を入れるメソッドも作ります。
* フィールドに値を入れます。
*/
public void setData( int param )
{
data = param;
}
/** * フィールドに値を入れます。 */ public void setData( int param ) { data = param; }
このsetData()メソッドは、dataフィールドに値を入れるだけのメソッドです。
この「フィールドに値を入れるメソッド」を「Setter」(セッター)と言います。
こちらもメソッド名の作り方が決まっていて、「setフィールド名」という名前にします。なので、「data」フィールドのSetterメソッドは「setData」というメソッド名になります。
この例だと、フィールドをpublicにした時と変わらないので、なんのためにGetterとSetterを作るのか、と思われるのかもしれません。
でも、先ほど言ったように、フィールドは守る必要があります。フィールドの前にGetterとSetterが門番として立ちはだかっているだけで意味があります。
たとえば、dataフィールドを「テストの点数」を入れるフィールドとします。そうすると、dataフィールドには0~100の値が入ることになります。
もしdataフィールドがpubilcだと、クラスの外には悪いヤツがいっぱいいますから、dataフィールドに-100とか10000といった無茶苦茶な値を入れられてしまうかもしれません。
でも、Setterメソッドがあればそんなことさせません。Setterメソッド門番になって、入れようとする値が0~100かチェックすることができます。
また、何らかの間違いでdataフィールドに-100とか10000が入っても、Getterメソッドでそれをチェックして正しい値を返すこともできます。
フィールドは結局はただの変数ですから、なされるがままになってしまいます。
でも、GetterとSetterというメソッドがフィールドの前にあれば、フィールドを守る事ができるわけです。
面倒でもGetterとSetterは作ろう!
まぁ、実際にはGetterとSetterが必要ない場面も結構あります。
それでも必ずGetterとSetterは作りましょう。
GetterとSetterは、Eclipse等のツールを使用すれば、フィールドから自動的に作ることができます。
また、GetterとSetterはWebアプリケーションで使用する「JavaBeans」という種類のクラスでは必ず作らなければなりません。
なので、めんどくさがらず必ず作るようにしましょう。
(ただし、このコンテンツ内で、説明を分かりやすくするためGetterとSetterを作らないことがあります。その点はご了承ください)