protectedフィールド
日本語 | 保護フィールド |
英語 | protected field |
ふりがな | ぷろてくてっどふぃーるど |
フリガナ | プロテクテッドフィールド |
protectedで修飾されたフィールド。
「protected 型 フィールド名;」のように、フィールドの宣言の先頭にprotectedが付けられたフィールド。
protectedフィールドは「パッケージの異なるクラスからアクセスすることができない」という制限が設けられている。ただし、パッケージが異なっていても「サブクラスからのアクセス」は許可されている。それ以外は、publicフィールドと同様。
「サブクラスからアクセスできる」というメリットがあるため、「同クラスのメソッドからアクセスするのと同じように、サブクラスからもアクセスしたい」場合にフィールドをprotectedにする。
だが、これは単なる「見た目の利便性」だけである。「同パッケージからアクセスできる」「サブクラスからアクセスできる」点を考えると、publicフィールド並にセキュリティが甘いと考えるべきであり、protectedフィールドを作ることは推奨しない。フィールドは全てprivateフィールドとし、模試必要ならprotectedフィールドの代わりとしてprotectedメソッドのgetter/setterを用意すればよい。
「protected 型 フィールド名;」のように、フィールドの宣言の先頭にprotectedが付けられたフィールド。
protectedフィールドは「パッケージの異なるクラスからアクセスすることができない」という制限が設けられている。ただし、パッケージが異なっていても「サブクラスからのアクセス」は許可されている。それ以外は、publicフィールドと同様。
「サブクラスからアクセスできる」というメリットがあるため、「同クラスのメソッドからアクセスするのと同じように、サブクラスからもアクセスしたい」場合にフィールドをprotectedにする。
だが、これは単なる「見た目の利便性」だけである。「同パッケージからアクセスできる」「サブクラスからアクセスできる」点を考えると、publicフィールド並にセキュリティが甘いと考えるべきであり、protectedフィールドを作ることは推奨しない。フィールドは全てprivateフィールドとし、模試必要ならprotectedフィールドの代わりとしてprotectedメソッドのgetter/setterを用意すればよい。
参考サイト
- (参考サイトはありません)
// Sample.java
// testパッケージのOtherPackageClassクラスを使用します。
import test.OtherPackageClass;
public class Sample
{
public static void main( String[] args )
{
// 同パッケージのクラスの場合。
NormalClass normalClass = new NormalClass();
// protectedフィールドを別クラスからアクセスします。
normalClass.data = 100;
System.out.println( normalClass.data );
// 100
// このように、普通にアクセスできます。
// 他のパッケージのクラスの場合。
OtherPackageClass otherPackageClass = new OtherPackageClass();
// otherPackageClass.data = 100;
// コンパイルエラー:
// フィールド otherPackageClass.data は不可視です。
// サブクラスを使用します。
ExtendedOtherPackageClass extendedOtherPackageClass = new ExtendedOtherPackageClass();
extendedOtherPackageClass.setData( 200 );
System.out.println( extendedOtherPackageClass.getData() );
// 200
// このように、サブクラスのメソッドからはアクセスできます。
}
}
/**
* フツーのクラス。
*/
class NormalClass
{
/**
* protectedフィールド。
*/
protected int data;
}
/**
* OtherPackageClassのサブクラス。
*/
class ExtendedOtherPackageClass extends OtherPackageClass
{
/**
* setter
*/
protected void setData( int i )
{
// スーパークラスOtherPackageClassの
// dataフィールドに値をセットします。
data = i;
}
/**
* getter
*/
protected int getData()
{
// スーパークラスOtherPackageClassの
// dataフィールドから値を取得します。
return data;
}
}
// test/OtherPackageClass.java
package test;
/**
* フツーのクラス。
*/
public class OtherPackageClass
{
/**
* protectedフィールド。
*/
protected int data;
}
// testパッケージのOtherPackageClassクラスを使用します。
import test.OtherPackageClass;
public class Sample
{
public static void main( String[] args )
{
// 同パッケージのクラスの場合。
NormalClass normalClass = new NormalClass();
// protectedフィールドを別クラスからアクセスします。
normalClass.data = 100;
System.out.println( normalClass.data );
// 100
// このように、普通にアクセスできます。
// 他のパッケージのクラスの場合。
OtherPackageClass otherPackageClass = new OtherPackageClass();
// otherPackageClass.data = 100;
// コンパイルエラー:
// フィールド otherPackageClass.data は不可視です。
// サブクラスを使用します。
ExtendedOtherPackageClass extendedOtherPackageClass = new ExtendedOtherPackageClass();
extendedOtherPackageClass.setData( 200 );
System.out.println( extendedOtherPackageClass.getData() );
// 200
// このように、サブクラスのメソッドからはアクセスできます。
}
}
/**
* フツーのクラス。
*/
class NormalClass
{
/**
* protectedフィールド。
*/
protected int data;
}
/**
* OtherPackageClassのサブクラス。
*/
class ExtendedOtherPackageClass extends OtherPackageClass
{
/**
* setter
*/
protected void setData( int i )
{
// スーパークラスOtherPackageClassの
// dataフィールドに値をセットします。
data = i;
}
/**
* getter
*/
protected int getData()
{
// スーパークラスOtherPackageClassの
// dataフィールドから値を取得します。
return data;
}
}
// test/OtherPackageClass.java
package test;
/**
* フツーのクラス。
*/
public class OtherPackageClass
{
/**
* protectedフィールド。
*/
protected int data;
}
// Sample.java // testパッケージのOtherPackageClassクラスを使用します。 import test.OtherPackageClass; public class Sample { public static void main( String[] args ) { // 同パッケージのクラスの場合。 NormalClass normalClass = new NormalClass(); // protectedフィールドを別クラスからアクセスします。 normalClass.data = 100; System.out.println( normalClass.data ); // 100 // このように、普通にアクセスできます。 // 他のパッケージのクラスの場合。 OtherPackageClass otherPackageClass = new OtherPackageClass(); // otherPackageClass.data = 100; // コンパイルエラー: // フィールド otherPackageClass.data は不可視です。 // サブクラスを使用します。 ExtendedOtherPackageClass extendedOtherPackageClass = new ExtendedOtherPackageClass(); extendedOtherPackageClass.setData( 200 ); System.out.println( extendedOtherPackageClass.getData() ); // 200 // このように、サブクラスのメソッドからはアクセスできます。 } } /** * フツーのクラス。 */ class NormalClass { /** * protectedフィールド。 */ protected int data; } /** * OtherPackageClassのサブクラス。 */ class ExtendedOtherPackageClass extends OtherPackageClass { /** * setter */ protected void setData( int i ) { // スーパークラスOtherPackageClassの // dataフィールドに値をセットします。 data = i; } /** * getter */ protected int getData() { // スーパークラスOtherPackageClassの // dataフィールドから値を取得します。 return data; } } // test/OtherPackageClass.java package test; /** * フツーのクラス。 */ public class OtherPackageClass { /** * protectedフィールド。 */ protected int data; }