Используйте "константы"
Компилятор не будет жаловаться при передаче строкового литерала, если он имеет правильный тип.
Однако при передаче переменной в качестве параметра переменная должна быть по крайней мере определена.
Вы можете определить некоторую переменную класса "константы" для каждого действия и предложить вызывающей стороне использовать их. Компилятор выдаст вам ошибку, если параметр переменной не определен.
public class TomAction {
public static final String GO_ACTION = "go";
...
}
Чтобы позвонить, вместо этого:
TomAction act = new TomAction("go", ...);
Сделайте это:
TomAction act = new TomAction(TomAction.GO_ACTION, ...);
Если вы попытаетесь использовать неопределенную переменную:
TomAction act = new TomAction(TomAction.WRONG_ACTION, ...);
Вы получите ошибку:
TestClass.WRONG_CONSTANT cannot be resolved
Использовать типы объектов
Чтобы расширить идею передачи переменных, почему бы не передать объекты и не потребовать, чтобы объект имел правильный тип? Таким образом, они больше не передают String, поэтому они абсолютно не могут передавать то, что не определено.
public class ActionType {
public String action;
}
public class GoAction extends ActionType {
public GoAction() {
this.action = "go";
}
}
public class TomAction {
public TomAction(ActionType actionType, ...) {
// Use actionType.action
...
}
...
}
Чтобы позвонить, вы делаете это:
TomAction act = new TomAction(new GoAction(), ...);
Конечно, это приводит нас к ...
Расширить класс
Расширить класс вместо использования параметра.
public class GoAction extends TomAction {
}
Тогда сделайте это:
TomAction act = new GoAction(...);