例えば、第1章からの例題、
個々のガソリンスタンドは,単価,全売上,売るガソリンの残量のデータを管理しています.市内に2店舗ある支店の売上と残量を管理するプログラムを作りなさい. の問題に対して,そのガソリンスタンドの店舗に相当するクラス GasStation について、
public class GasStation { int unitPrice; int sales; int remain; void init(int u, int s, int r){ // 実際の初期化のための処理を書く,例えば, unitPrice = u; sales=s; remain=r; } int sales(int fuil){ // 実際の売上のための処理を書く,例えば, remain -= fuil; sales += fuil * unitPrice; return sales; } void show(){ // 実際の現状を表示するための処理を書く,例えば, System.out.println(sales); System.out.println(remain); } }というクラス(データ型とメソッド)を実装し,また、あるクラス(例えばmainメソッド)の中で,
. . . GasStation gs; gs=new GasStation(); gs.init(10, 100, 1000); // ある処理をする gs.show(); . .などと使うと紹介しました.しかし,上記のクラス定義のままでは, GasStationクラスの外部から、
. . GasStation gs; gs=new GasStation(); gs.unitPrice=10; gs.sales=100; gs.remain=1000; . .のように,構造体のメンバー変数と同様に,クラス内の属性を直接操作できます.
これはソフトウェア工学的に,あまり良くないプログラムスタイルだとされています.理由として,
- グローバル変数と同様に,属性がどこで変更され参照されているかを追跡することが困難になる.
- 後から具体的なデータの蓄え方(例えばintにするかlongにするかなど)を変更する場合に,その波及が大きい.
そこで,クラス内の属性を明示的に外から操作できないようにするための手法がJavaでは用意されています.
public class GasStation { private int unitPrice; private int sales; private int remain; void init(int u, int s, int r){ // 以下省略.属性にprivateというキーワードを使うことによって,そのクラス内のメソッド以外からは,当該の変数にアクセスができなくなります.
※private属性がかかっているメソッドや変数に対して、無理やりアクセスしようとすると、そのクラスのコンパイル時に引っかかってエラーとなります。従って、実行できません。
2003年10月1日 12:01 更新