Предположим, что следующий класс
interface Thing {
void doSomething();
}
public class Test {
public void doWork() {
//Do smart things here
...
doSomethingToThing(index);
// calls to doSomethingToThing might happen in various places across the class.
}
private Thing getThing(int index) {
//find the correct thing
...
return new ThingImpl();
}
private void doSomethingToThing(int index) {
getThing(index).doSomething();
}
}
Intelli-J сообщает мне, что я нарушаю закон деметра, поскольку DoSomethingToThing использует результат функции, и якобы вы можете вызывать только методы полей, параметров или самого объекта.
Неужели мне нужно делать что-то вроде этого:
public class Test {
//Previous methods
...
private void doSomething(Thing thing) {
thing.doSomething();
}
private void doSomethingToThing(int index) {
doSomething(getThing(index));
}
}
Я считаю это обременительным. Я думаю, что закон Деметры таков, что один класс не знает внутренней части ДРУГОГО класса, но getThing()
принадлежит к тому же классу!
Это действительно нарушение закона Деметры? это действительно улучшает дизайн?
Спасибо.