使用隐藏构造函数扩展类

时间:2014-01-17 11:28:38

标签: java android

我有一个基类FiniteStateMachine,其列表为State。状态只能通过FSM实例化,因此我可以确保更新列表。

public class FiniteStateMachine {
    private List<State> states = new ArrayList<State>();

    public State addState(String name) {
        State s = new State(name);
        states.add(s);
        return s;
    }

    protected void addState(State s) {
        states.add(State s);
    }

    public static class State {
        private String name;
        protected State(String name) { this.name = name; }
    }
}

现在,我想将FiniteStateMachineState类扩展为MyFSMMyState类。我仍然希望确保只能通过FSM创建新的MyState状态,以确保它们是列表的一部分。
这是我到目前为止所做的:

public MyState extends FinitStateMachine.State {
    private int n;

    protected MyState(int n, String name) {
        super(name);
        this.n = n;
    }
}

public MyFSM extends FiniteStateMachine {
    @Override
    public State addState(String name) {
        throw new UnsupportedOperationException();
    }

    public MyState addState(int n, String name) {
        MyState s = new MyState(n, name);
        super.addState(s);
        return s;
    }

}

我不确定我做得对。
首先,原始的State类是FiniteStateMachine的内部类,在这里我将它扩展到我的新课程MyFSM之外。
其次,我必须在原始FiniteStatMachine

中添加新方法
    protected void addState(State s) {
        states.add(State s);
    }

否则我不知道如何将新MyState类的状态附加到FiniteStateMachine列表中。 第三,我没有覆盖addState(name)方法,而是瘫痪了它并抛出异常,而是提出了一个全新的方法来返回新类。

如果这些情况有编码模式,我不知道。但我想知道,所以我不去重新发明轮子。

1 个答案:

答案 0 :(得分:0)

如果使列表变量受到保护,您也可以从子类访问它,而不使用add方法。这取决于您以后想要做什么,以及您希望列表有多可见。如果您希望能够从继承层次结构外部添加状态,或者您不希望列表在整个包中可见,则可能需要addState方法。

相关问题