Это действительно зависит от того, как вы моделируете свою проблему. Но я думаю, что обращая внимание на инкапсуляцию , принцип ООП нам поможет. Инкапсуляция хочет, чтобы мы скрывали информацию об объекте внутри себя или, другими словами, каждый объект отвечал за выполнение своих собственных действий.
Возвращаясь к вашему вопросу, сначала давайте рассмотрим случай, в котором Fruit
объект является только основная структура данных (т.е. Apple
объект является полным надмножеством Fruit
в ответственности). В этом случае, если вы попросите разработчиков создать для вас объект Fruit
и передать его, вы подвергаете свои внутренние обязанности, и вы можете позволить разработчику получить доступ к нежелательным данным или поведением.
Fruit f = new Fruit();
f.doSomethingPrivate(); // This is not intended for an Apple to be set externally
Apple a = new Apple(f); // Now the Fruit object may not comply with Apple definition
Теперь очевидно, что в некоторых случаях приведенный выше пример - это именно то, что вы хотите сделать. Рассмотрим теперь структуру композиции (см. here). В составе у вас есть контейнер , который не предполагает инкапсуляции обязанностей по содержащимся в нем элементам.
Очень простой пример может быть университетским курс, в котором некоторые студенты зачислить и имеют инструктор:
public class Course {
private Person instructor;
private Person[] students;
}
Здесь, это не ответственность Course
объекта подвергать инструктор или студент поведение. Вместо этого контейнерный объект может иметь методы getInstructor()
и setInstructor()
, и разработчик может принять решение о содержащихся в композиции элементах.
Почему вы хотите, чтобы объект Fruit в Apple в первую очередь? – dragon66
Его просто надуманный пример, чтобы иметь некоторый контекст вокруг моего вопроса. Существенно сводится к следующему: если у меня есть экземпляр другого класса в моем внешнем классе, лучше всего его настроить внутри или снаружи –
Внутренне это путь. – dragon66