導入
ここまで private なフィールドと public 相当の(何もつけない)メソッドを組み合わせて使ってきました。最後に、この使い分けの基本方針を整理しましょう。
説明
基本方針はシンプルです。
| 修飾子 | 意味 | 使いどころ |
|---|---|---|
private | クラスの中だけからアクセス可能 | フィールド全般。外に見せる必要のない内部処理用メソッド |
public | どこからでもアクセス可能 | 外部に公開したいメソッド(getter/setterなど) |
基本ルール:フィールドは原則すべて private にし、外に見せたい振る舞いだけを public なメソッドとして用意する。 クラスの内部だけで使う「補助的な処理」も private メソッドにできます。
public class Main {
public static void main(String[] args) {
Product p = new Product("ノート", 300);
System.out.println(p.getLabel());
}
}
class Product {
private String name;
private int price;
Product(String name, int price) {
this.name = name;
this.price = price;
}
private String formatPrice() {
return price + "円";
}
public String getLabel() {
return name + ":" + formatPrice();
}
}
formatPrice() は Product クラスの中でしか使わない補助的な処理なので private にしています。外部に公開する必要があるのは getLabel() だけなので、こちらだけ public です。「外に見せるものだけを絞り込む」ことで、クラスの使い方がシンプルになり、内部の実装を後から自由に変更しやすくなります。
やってみよう
下のエディタで formatPrice() の中身(表示形式)を変えて実行し、getLabel() の見た目が変わることを確認しましょう。formatPrice を public に変えても動くこと(=コンパイル上は問題ないが、外から呼ぶ必要がないメソッドを公開する必要はないこと)も考えてみてください。
演習
Circle(円)クラスに private double radius を持たせ、コンストラクタで初期化してください。内部でだけ使う private double square() メソッド(radius * radius を返す)を用意し、それを使って円の面積を返す public double area() メソッド(3.14 * square())を用意してください。main で半径 10 の Circle を作り、area() の結果を表示してください。
ヒント1を見る
private double square() { return radius * radius; } を書きます。
ヒント2を見る
public double area() { return 3.14 * square(); } とし、System.out.println(c.area()); で表示します。