保護された列挙変数を含む MyAction という抽象クラスがあります。クラスは次のように定義されます。
package mypackage;
public abstract class MyAction {
public enum ActionId {
ACTION1, ACTION2;
}
protected ActionId actionId;
// constructor
public MyAction(ActionId actionId) {
this.actionId = actionId;
}
public ActionId getActionId() {
return actionId;
}
...
...
}
MyAction を拡張する特定のアクション MyAction1 を作成しました。
package mypackage;
public class MyAction1 extends MyAction {
public MyAction1() {
super(ActionId.ACTION1);
}
...
...
}
MyAction1 のインスタンスを作成し、それを HashMap に格納するシングルトン ユーティリティ クラス (同じパッケージ内) があります。
package mypackage;
public class MyActionFactory {
private static MyActionFactory theInstance;
private HashMap<ActionId, MyAction> actions;
private MyActionFactory() {
actions = new HashMap<ActionId, MyAction>();
MyAction1 myAction1 = new MyAction1();
actions.put(myAction1.actionId, myAction1); // able to access protected variable actionId
}
public static VsActionFactory getInstance() {
if (theInstance == null)
theInstance = new VsActionFactory();
return theInstance;
}
...
...
}
メソッドactions.put( myAction1.actionId , myAction1)で、保護されたメンバーactionIdにアクセスできることに注意してください。
MyAction1のインスタンスの保護されたメンバーactionId (基本クラスMyActionに含まれる) にアクセスできるのはなぜですか? 保護されたメンバーはサブクラスのみがアクセスできると思いました。
MyActionFactoryが他のパッケージと同じパッケージに含まれていることと関係がありますか?