
再利用性の高いクラス作成に重要な“アクセス制御”
株式会社ガリレオ
小山博史
2010/1/28
■ 生成されたアクセサメソッドをソースコードで確認
この機能を使って生成されたアクセサメソッドを持つクラスは、下記のようになります。
sample14/app5/UserInfo.javapackage sample14.app5;
class UserInfo {
private String name;
private String eMail;
private boolean member;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEMail() {
return eMail;
}
public void setEMail(String mail) {
eMail = mail;
}
public boolean isMember() {
return member;
}
public void setMember(boolean member) {
this.member = member;
}
}
コラム 「JavaBeansコンポーネントアーキテクチャと“属性”」 |
| Javaでは、「JavaBeansコンポーネントアーキテクチャ」といわれるものがあり、このコンポーネントアーキテクチャを採用している環境では、オブジェクトの属性はアクセサメソッドで表現します。 UserInfoクラスは、属性name、email、memberが定義されていて、属性nameの値はgetNameメソッドで取得できますし、setNameメソッドで設定できるということです。 |
フィールドを保護する! protected宣言とは
最後に、protected宣言されたフィールドを持つクラスも作成してみましょう。次のように、protectedなString型のフィールド「f1」を持つSampleクラスを作成してみます。
sample14/app6/Sample.javapackage sample14.app6;
public class Sample {
protected String f1;
private String f2;
}
Sampleクラスを拡張するSample1クラスを次のように作成します。f1についてはprotectedなので、Sample1クラスで利用できることが分かります。しかし、private宣言されたフィールドf2はSample1クラスでは利用できません。すなわち、コメント部分を有効にすると、エラーになります。
sample14/app6/Sample1.javapackage sample14.app6;
public class Sample1 extends Sample {
public void setF1(String f1) {
this.f1 = f1;
}
public String getF1() {
return f1;
}
/* f2はprivateフィールドなので使えません
public void setF2(String f2) {
this.f2 = f2;
}
public String getF2() {
return f2;
}
*/
}
SampleクラスとSample1クラスを利用するAppクラスを次のように作成します。f1についてはprotectedなので、同一パッケージであるAppクラスで利用できることが分かります。しかし、private宣言されたフィールド「f2」はAppクラスから利用できません。
なお、Sample1がSampleから実装継承したフィールド「f1」についても、同じアクセス制限が適用されるため、Appからアクセスできます。
sample14/app6/App.javapackage sample14.app6;
public class App {
public static void main(String[] args) {
Sample sample = new Sample();
sample.f1 = "f1";
System.out.println(sample.f1);
// sample.f2 = "f2"; // privateなフィールドは使えない
Sample1 sample1 = new Sample1();
sample1.f1 = "f1";
System.out.println(sample1.getF1());
}
}
packageが別になると、protectedなフィールドであるf2も使えなくなるので、sample14.app7.Appクラスでは、sample14.app6.Sampleクラスのf1へは直接アクセスできません。しかし、sample14.app7.Sample1のsample14.app6.Sampleを拡張した場合は、f1へアクセス可能です。
sample14/app7/Sample1.javapackage sample14.app7;
import sample14.app6.Sample;
public class Sample1 extends Sample {
public void setF1(String f1) {
this.f1 = f1;
}
public String getF1() {
return f1;
}
}
sample14/app7/App.java
package sample14.app7;
public class App {
public static void main(String[] args) {
sample14.app6.Sample sample = new sample14.app6.Sample();
// sample.f1 = "f1"; // ほかのパッケージ内クラスのprotectedなフィールドは使えない
Sample1 sample1 = new Sample1();
System.out.println(sample1.getF1());
}
}
アクセス制御はクラスの設計時に考慮するべき
今回は、アクセス制御について説明しました。あるクラス内のデータ構造にほかのクラスが依存してしまうと、そのデータ構造を変更するときに大きな影響があることから、ほかのクラスが使用する必要がないフィールドやメソッドについては、アクセスできないようにすることは理解できたでしょうか。
ほかのクラスに使用してもらうフィールドやメソッドについては、publicキーワードを付け、自分のクラスでしか使用しないフィールドやメソッドについては、privateキーワードを付けるという基本を身に付けてください。アクセス制御のためのキーワードを付けたり、protectedキーワードを付けたりするクラスを設計することは、初心者のうちはあまりないかもしれませんが、文法的な意味はきちんと理解して、使えるようにしておきましょう。
今回作ったサンプルのソースコードはこちらからダウンロードできます。
■ @IT関連記事
| クラスのメンバに利用制限を付与するアクセス制御 [連載]いまから始めるJava(9) 外部から勝手にデータを変更されたり、参照されることからクラスのメンバを守るためには、アクセス制御を活用します 「Java
Solution」フォーラム 2003/9/17 |
| JavaBeansのJavaBeansたるゆえん やり直し「JSPとTomcat」(7) Java開発においてもはや常識の感があるJavaBeans。しかし、その定義やルールについて説明するとなると…。1度おさらいをしてみよう 「Java Solution」フォーラム 2006/11/11 |
![]() |
アクセス制御を習得する ソースコードで学ぶ SJC-P 5.0 ドリル(9) public、privateなどのアクセス修飾子は、コンストラクタ、変数など種類によって適用個所が違う! どう使い分ければいいの? |
|
| Java SE コアAPI 使用コード例一覧 Java開発者/プログラマのための、Java SEコアAPIの使用コード例の記事へのJavadocっぽいリンク集。メソッドやコンストラクタ、例外などAPIの使い方の参考にしてください 「Java Solution」フォーラム 2009/3/24 |
| ActionScriptで学ぶクラスやオブジェクト指向の基礎 Flashの基礎を無料で習得! ActionScript入門(4) 本格的なオブジェクト指向言語となったActionScript 3.0を通じてクラスやフィールド、メソッドなどの基本を学びましょう 「リッチクライアント & 帳票」フォーラム 2008/4/9 |
||
| 第3章 C#におけるクラスとインスタンス 連載:改訂版 C#入門 C#を使いこなすためには、「オブジェクト指向」という考え方を把握する必要がある。今回はその中核となる「クラス」と「インスタンス」について解説する 「Insider.NET」フォーラム 2002/9/4
|
| VB.NETにおける継承とポリモーフィズム 連載:改訂版 VB.NETプログラミング(10) VB.NETを使いこなすうえで最大の難所ともなるポリモーフィズム。サンプル・プログラムによる実例を示しながら、その真価を探る 「Insider.NET」フォーラム 2004/6/24
|
| 筆者プロフィール |
| 小山博史(こやま ひろし) 情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。 著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。 |
| Index | ||||||||
|
||||||||
【改訂版】Eclipseではじめるプログラミング バックナンバー 連載インデックスへ»
- 第1回 Eclipse 3.4で超簡単Javaプログラミング基礎入門
- 第2回 Javaで一から理解するプログラムの変数と演算子
- 第3回 プログラミングの醍醐味! Javaで“条件式”を理解する
- 第4回 プログラミングの真骨頂! Javaで“反復処理”を覚える
- 第5回 データ集合を扱うのに便利なJavaの配列と拡張for文
- 第6回 複雑なデータを表現できるクラスやフィールドって?
- 第7回 クラスの振る舞いを表すJavaの“メソッド”とは?
- 第8回 Javaの参照型を文字列操作で理解して文法を総復習
- 第9回 プログラムを「変更」しやすくする“インターフェイス”
- 第10回 Javaの実案件に必須のパッケージとインポートを知る
- 第11回 「static」でクラス共有の変数・メソッドを使いこなせ!
- 第12回 継承やオーバーライドで簡単にクラスを“拡張”しよう
- 第13回 “コンストラクタ”と初期化、本当に理解できてる?
- 第14回 再利用性の高いクラス作成に重要な“アクセス制御”
- 第15回 Javaは「抽象クラス」で実装を上手に再利用できる
- 第16回 “ネスト”した型で始める軽量Javaプログラミング!?
- 第17回 あなたの知らない、4つのマニアックなJava文法
- 第18回 強く型付けされているJavaの理解に必修の“型変換”
- 第19回 キュー構造をJavaで実装してジェネリック型を理解する
- 第20回 拡張for文の真の実力を知り、反復処理を使いこなせ
- 第21回 7ステップで理解するJavaでの列挙型/enum使用法
- 第22回 いまさら聞けない「Javadoc」と「アノテーション」入門
- 第23回 プログラマの宿命! 例外とエラー処理を理解する
- 第24回 Javaの例外処理で知らないと損する7つのテクニック
| Java Solution全記事一覧 |
TechTargetジャパン
- Scalaのパッケージ、アクセス修飾子、オブジェクト継承 (2012/5/22)
インポート、パッケージオブジェクト、抽象クラス/抽象メソッド、オーバーライド、final、シールドクラスなども - 基幹系システムでCloud SQLは使えるか試してみた (2012/5/17)
サンプルとしてMRPシステムを作成して動かし、「再帰呼び出し」などのパフォーマンスを測定して検証してみます - アジャイル管理ツール9選+Pivotal Tracker入門 (2012/5/14)
群雄割拠のアジャイルプロジェクト管理ツールを9つ紹介し、特に注目を集めているPivotal Trackerの基本的な使い方を解説します - サーバサイドJSやJavaでWebアプリが作れるXPages (2012/5/11)
Notes/Dominoの資産をサーバサイドJavaScriptやJavaで操作し、HTMLやJavaScript、CSSをUIにできる技術を紹介
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -

