Я пытаюсь включить более функциональные идиомы программирования в мою разработку Java. Один шаблон, который мне нравится больше всего и который избегает побочных эффектов, - это создание классов, которые имеют поведение, но не обязательно имеют какое-либо состояние. Поведение заблокировано в методах, но они действуют только на переданные параметры.
Код ниже - это код, который я пытаюсь избежать:
public class BadObject {
private Map<String, String> data = new HashMap<String, String>();
public BadObject() {
data.put("data", "data");
}
/**
* Act on the data class. But this is bad because we can't
* rely on the integrity of the object's state.
*/
public void execute() {
data.get("data").toString();
}
}
Код ниже не является чем-то особенным, но я воздействую на параметры, и состояние содержится в этом классе. Мы все еще можем столкнуться с проблемами с этим классом, но это проблема с методом и состоянием данных, мы можем решать проблемы в подпрограмме, а не доверять всему объекту.
Это какая-то форма идиомы? Это похоже на любой шаблон, который вы используете?
public class SemiStatefulOOP {
/**
* Private class implies that I can access the members of the <code>Data</code> class
* within the <code>SemiStatefulOOP</code> class and I can also access
* the getData method from some other class.
*
* @see Test1
*
*/
class Data {
private int counter = 0;
public int getData() {
return counter;
}
public String toString() { return Integer.toString(counter); }
}
/**
* Act on the data class.
*/
public void execute(final Data data) {
data.counter++;
}
/**
* Act on the data class.
*/
public void updateStateWithCallToService(final Data data) {
data.counter++;
}
/**
* Similar to CLOS (Common Lisp Object System) make instance.
*/
public Data makeInstance() {
return new Data();
}
} // End of Class //
Проблемы с кодом выше:
Я хотел объявить класс Data закрытым, но тогда я не могу ссылаться на него вне класса:
Я не могу переопределить класс SemiStateful и получить доступ к закрытым членам.
Использование:
final SemiStatefulOOP someObject = new SemiStatefulOOP();
final SemiStatefulOOP.Data data = someObject.makeInstance();
someObject.execute(data);
someObject.updateStateWithCallToService(data);
Edit-1: Это хороший комментарий. Мой ответ: «Как только вы сделаете класс Data доступным вне основного класса, вы раскрываете детали реализации», - комментарий.
Мой ответ: Класс Data является простым POJO и будет работать как другие pojos с сеттерами и геттерами. То, что я делал в вышеприведенном классе, пыталось манипулировать только классом Data из класса поведения SemiStatefulOOP. Я намерен иметь классы без состояния, но я хотел иметь четкое отделение от классов состояния и классов поведения.
Связанный:
Шаблон дизайна без сохранения состояния
http://guides.brucejmack.biz/Pattern%20Documents/Stateless%20Design%20Pattern.htm