アクセスコントロール
日本語 | 使用制限 |
英語 | access control |
ふりがな | あくせすこんとろーる |
フリガナ | アクセスコントロール |
クラス、メソッド、フィールドについて、「どこから使用できるか」を制限すること。
それぞれのクラス、メソッド、フィールドの「使用範囲」を決めることで「して欲しくない処理をされる」ことを防ぐことができる。
public private protectedといったアクセス修飾子を使用するか、もしくは何も修飾しないこと(「無印」、「デフォルト」)で「使用範囲」が決定される。
アクセスコントロールを適切に行うことでプログラムを安全にすることができる。ただし、場合によっては修正が難しくなる等、適切な使用が求められる難しい機能でもある。
詳しくは以下のアクセス修飾子を参照。
・public
・無印
・protected
・private
また、同じアクセス修飾子でも、修飾する対象によって挙動が異なる。
各対象については以下を参照。
・publicクラス
・無印クラス
・protectedクラス
・privateクラス
・publicフィールド
・無印フィールド
・protectedフィールド
・privateフィールド
・publicメソッド
・無印メソッド
・protectedメソッド
・privateメソッド
基本的には、クラスはpublic、フィールドはprivate、メソッドはpublic時々protectedやprivate、無印は使用しない、と使い分ければいいだろう。
それぞれのクラス、メソッド、フィールドの「使用範囲」を決めることで「して欲しくない処理をされる」ことを防ぐことができる。
public private protectedといったアクセス修飾子を使用するか、もしくは何も修飾しないこと(「無印」、「デフォルト」)で「使用範囲」が決定される。
アクセスコントロールを適切に行うことでプログラムを安全にすることができる。ただし、場合によっては修正が難しくなる等、適切な使用が求められる難しい機能でもある。
詳しくは以下のアクセス修飾子を参照。
・public
・無印
・protected
・private
また、同じアクセス修飾子でも、修飾する対象によって挙動が異なる。
各対象については以下を参照。
・publicクラス
・無印クラス
・protectedクラス
・privateクラス
・publicフィールド
・無印フィールド
・protectedフィールド
・privateフィールド
・publicメソッド
・無印メソッド
・protectedメソッド
・privateメソッド
基本的には、クラスはpublic、フィールドはprivate、メソッドはpublic時々protectedやprivate、無印は使用しない、と使い分ければいいだろう。
参考サイト
- (参考サイトはありません)
// この例では、testパッケージのTestPackageClassクラスの
// フィールドを対象に、どこからアクセスできるのかを説明します。
// test/OtherPackageClass.java
package test;
/**
* testパッケージのクラス。
*/
public class TestPackageClass
{
// publicフィールド。
public int publicField = 0;
// 無印(デフォルト)フィールド。
int defaultField = 0;
// protectedフィールド。
protected int protectedField = 0;
// privateフィールド。
private int privateField = 0;
// TestPackageClassクラスのメソッド。
public void useField()
{
// 同じクラスからは、全てアクセスできます。
publicField = 0;
defaultField = 0;
protectedField = 0;
privateField = 0;
}
}
/**
* TestPackageClassクラスの、同じパッケージの別クラス。
*/
class SamePackageClass
{
// TestPackageClassクラスのフィールドを使用するメソッド。
public void useTestPackageClasssField()
{
TestPackageClass testPackageClass = new TestPackageClass();
// 同じパッケージの別クラスからは、
// private以外全てアクセスできます。
testPackageClass.publicField = 0;
testPackageClass.defaultField = 0;
testPackageClass.protectedField = 0;
// testPackageClass.privateField = 0;
// コンパイルエラー:
// フィールド testPackageClass.privateField は不可視です。
}
}
// Sample.java
/**
* TestPackageClassクラスの、別パッケージの別クラス。
*/
public class Sample
{
// Sampleクラスのメソッド。
public static void main( String[] args )
{
test.TestPackageClass testPackageClass = new test.TestPackageClass();
// 別パッケージの別クラスからは、
// publicのみアクセスできます。
testPackageClass.publicField = 0;
// testPackageClass.defaultField = 0;
// コンパイルエラー:
// フィールド testPackageClass.defaultField は不可視です。
// testPackageClass.protectedField = 0;
// コンパイルエラー:
// フィールド testPackageClass.protectedField は不可視です
// testPackageClass.privateField = 0;
// コンパイルエラー:
// フィールド testPackageClass.privateField は不可視です。
}
}
/**
* TestPackageClassクラスの、別パッケージの別クラス。
* ただしTestPackageClassクラスのサブクラスです。
*/
class SamePackageClass extends test.TestPackageClass
{
// TestPackageClassクラスのフィールドを使用するメソッド。
public void useTestPackageClassField()
{
// サブクラスからは、publicとprotectedのみ
// アクセスできます。
publicField = 0;
// defaultField = 0;
// コンパイルエラー:
// フィールド defaultField は不可視です。
protectedField = 0;
// privateField = 0;
// コンパイルエラー:
// フィールド sample.privateField は不可視です。
}
}
// フィールドを対象に、どこからアクセスできるのかを説明します。
// test/OtherPackageClass.java
package test;
/**
* testパッケージのクラス。
*/
public class TestPackageClass
{
// publicフィールド。
public int publicField = 0;
// 無印(デフォルト)フィールド。
int defaultField = 0;
// protectedフィールド。
protected int protectedField = 0;
// privateフィールド。
private int privateField = 0;
// TestPackageClassクラスのメソッド。
public void useField()
{
// 同じクラスからは、全てアクセスできます。
publicField = 0;
defaultField = 0;
protectedField = 0;
privateField = 0;
}
}
/**
* TestPackageClassクラスの、同じパッケージの別クラス。
*/
class SamePackageClass
{
// TestPackageClassクラスのフィールドを使用するメソッド。
public void useTestPackageClasssField()
{
TestPackageClass testPackageClass = new TestPackageClass();
// 同じパッケージの別クラスからは、
// private以外全てアクセスできます。
testPackageClass.publicField = 0;
testPackageClass.defaultField = 0;
testPackageClass.protectedField = 0;
// testPackageClass.privateField = 0;
// コンパイルエラー:
// フィールド testPackageClass.privateField は不可視です。
}
}
// Sample.java
/**
* TestPackageClassクラスの、別パッケージの別クラス。
*/
public class Sample
{
// Sampleクラスのメソッド。
public static void main( String[] args )
{
test.TestPackageClass testPackageClass = new test.TestPackageClass();
// 別パッケージの別クラスからは、
// publicのみアクセスできます。
testPackageClass.publicField = 0;
// testPackageClass.defaultField = 0;
// コンパイルエラー:
// フィールド testPackageClass.defaultField は不可視です。
// testPackageClass.protectedField = 0;
// コンパイルエラー:
// フィールド testPackageClass.protectedField は不可視です
// testPackageClass.privateField = 0;
// コンパイルエラー:
// フィールド testPackageClass.privateField は不可視です。
}
}
/**
* TestPackageClassクラスの、別パッケージの別クラス。
* ただしTestPackageClassクラスのサブクラスです。
*/
class SamePackageClass extends test.TestPackageClass
{
// TestPackageClassクラスのフィールドを使用するメソッド。
public void useTestPackageClassField()
{
// サブクラスからは、publicとprotectedのみ
// アクセスできます。
publicField = 0;
// defaultField = 0;
// コンパイルエラー:
// フィールド defaultField は不可視です。
protectedField = 0;
// privateField = 0;
// コンパイルエラー:
// フィールド sample.privateField は不可視です。
}
}
// この例では、testパッケージのTestPackageClassクラスの // フィールドを対象に、どこからアクセスできるのかを説明します。 // test/OtherPackageClass.java package test; /** * testパッケージのクラス。 */ public class TestPackageClass { // publicフィールド。 public int publicField = 0; // 無印(デフォルト)フィールド。 int defaultField = 0; // protectedフィールド。 protected int protectedField = 0; // privateフィールド。 private int privateField = 0; // TestPackageClassクラスのメソッド。 public void useField() { // 同じクラスからは、全てアクセスできます。 publicField = 0; defaultField = 0; protectedField = 0; privateField = 0; } } /** * TestPackageClassクラスの、同じパッケージの別クラス。 */ class SamePackageClass { // TestPackageClassクラスのフィールドを使用するメソッド。 public void useTestPackageClasssField() { TestPackageClass testPackageClass = new TestPackageClass(); // 同じパッケージの別クラスからは、 // private以外全てアクセスできます。 testPackageClass.publicField = 0; testPackageClass.defaultField = 0; testPackageClass.protectedField = 0; // testPackageClass.privateField = 0; // コンパイルエラー: // フィールド testPackageClass.privateField は不可視です。 } } // Sample.java /** * TestPackageClassクラスの、別パッケージの別クラス。 */ public class Sample { // Sampleクラスのメソッド。 public static void main( String[] args ) { test.TestPackageClass testPackageClass = new test.TestPackageClass(); // 別パッケージの別クラスからは、 // publicのみアクセスできます。 testPackageClass.publicField = 0; // testPackageClass.defaultField = 0; // コンパイルエラー: // フィールド testPackageClass.defaultField は不可視です。 // testPackageClass.protectedField = 0; // コンパイルエラー: // フィールド testPackageClass.protectedField は不可視です // testPackageClass.privateField = 0; // コンパイルエラー: // フィールド testPackageClass.privateField は不可視です。 } } /** * TestPackageClassクラスの、別パッケージの別クラス。 * ただしTestPackageClassクラスのサブクラスです。 */ class SamePackageClass extends test.TestPackageClass { // TestPackageClassクラスのフィールドを使用するメソッド。 public void useTestPackageClassField() { // サブクラスからは、publicとprotectedのみ // アクセスできます。 publicField = 0; // defaultField = 0; // コンパイルエラー: // フィールド defaultField は不可視です。 protectedField = 0; // privateField = 0; // コンパイルエラー: // フィールド sample.privateField は不可視です。 } }