компилятор не может принудительно установить порядок вызовов методов, поскольку во многих случаях он не может статически определить порядок вызовов.Например:
public void whichOrder(boolean b)
{
if (b) call1();
if (!b) call2();
if (b) call2();
if (!b) call1();
}
Если необходимо, чтобы методы вызывались в правильном порядке, у вас есть несколько вариантов:
- документировать порядок вызовов, чтобы вызывающие абоненты знали, чтосделать.Это не приводит в исполнение порядок, но, по крайней мере, информирует об этом кодеров.
- добавляет состояние к вашему объекту, чтобы запомнить, какой метод был вызван последним, и проверить, что текущий вызываемый метод разрешен следующим.Это обеспечивает проверку метода во время выполнения.
- Использование фиктивной инфраструктуры (например, Moq) для модульного тестирования ваших клиентов.Это проверяет во время сборки, что порядок правильный.
Какой подход вы выберете, зависит от того, насколько критичен правильный порядок и последствия вызова методов в неправильном порядке.
Альтернативой является переработка вашего дизайна, чтобы упорядочение методов не стало проблемой.Например, оберните оба метода в третий, call3 (), который вызывает call1 () и call2 () в правильном порядке.Или, возможно, вызовите call2 (), чтобы вызвать call1 (), если он еще не был выполнен, и вызовите call1 (), если он уже запущен, и верните молча, если запуск не требуется.Если клиенты вызывают call2 (), а затем call1 (), вы все равно сначала получаете эффект call1 () (от внутреннего вызова call2 () до call1 ()), и вызов клиента call1 () приводит к отсутствию операции.
Например,
public void call3()
{
call1();
call2();
}
или
public void call2()
{
call1();
// rest of call2's logic
}
private boolean call1Called = false;
pubic void call1()
{
if (!call1Called)
{
call1Called=true;
call1Impl();
}
}