Size: a a a

2020 August 20

V

Vitaly Nechitaylo in learn.java
И вот про последнюю часто забывают
источник

DC

Denis Chikanov in learn.java
Konstantin
Всем здрасти такой вот глупый наверное вопрос.
Композиция, это один класс является частью другого, например двигатель не может существовать без машины, так как класс машина создает себе экземпляр двигателя самостоятельно например в конструкторе.
public class Car{
   private Engine engine;
   public Car(){
       engine = new Engine();
   }
}
Агрегация это когда один класс содержит другой класс, например двигатель передается в конструктор автомобиля и уже может существовать без автомобиля, даже если он будет уничтожен.
public class Car{
   private Engine engine;
   public Car(Engine engine){
       this.engine = engine;
   }
}

То тогда вопрос, если я создаю двигатель в конструкторе(по сути композиция) и создаю сеттер на двигатель(что уже по сути агрегация), то какое отношение будет иметь класс автомобиль по отношению к классу двигатель? Ведь он получается содержит и композицию и агрегацию 🤷‍♂️
public class Car{
   private Engine engine;
   public Car(){
       engine = new Engine();
   }
   public setEngine(Engine engine){
       this.engine = engine;
   }
}
Нет, то, где вы создаёте двигатель, и есть ли у него геттер и сеттер, не влияет на то, агрегация это или композиция. Влияет на это весь жизненный цикл двигателя и то, используется ли он где-то вне машины.
источник

K

Konstantin in learn.java
ну то используется он или нет где то снаружи обеспечит ссылку которая не даст gc его удалить. Но если делать как вы говорите, то по сути можно сделать в конструкторе объект двигателя, присвоить его приватному полю и дать возможность подлелиться ссылкой на него, например через геттер
источник

K

Konstantin in learn.java
и тогда это уже агрегация будет а не композиция
источник

V

Vitaly Nechitaylo in learn.java
Konstantin
ну то используется он или нет где то снаружи обеспечит ссылку которая не даст gc его удалить. Но если делать как вы говорите, то по сути можно сделать в конструкторе объект двигателя, присвоить его приватному полю и дать возможность подлелиться ссылкой на него, например через геттер
Вы опять уходите в реализацию. Абстрагируйтесь
источник

K

Konstantin in learn.java
Как бы я не говорю что вы не правы, я просто пытаюсь понять суть
источник

V

Vitaly Nechitaylo in learn.java
Это не про конструкции языка, а про отношение между объектами
источник

K

Konstantin in learn.java
Vitaly Nechitaylo
Вы опять уходите в реализацию. Абстрагируйтесь
ну тогда есть только ассоциация
источник

V

Vitaly Nechitaylo in learn.java
Давайте на ваших же примерах, авто и двигатель
источник

K

Konstantin in learn.java
давайте
источник

V

Vitaly Nechitaylo in learn.java
Если конкретный двигатель используется только в конкретном автомобиле - это какое отношение?
источник

V

Vitaly Nechitaylo in learn.java
И двигатель без автомобиля не существует
источник

K

Konstantin in learn.java
композиция. Раз он используется только в конкретном автомобиле
источник

V

Vitaly Nechitaylo in learn.java
А если в автомобиле используется двигатель, один из тех, что сейчас собирают на конвейре и каждый имеет серийный номер?
источник

V

Vitaly Nechitaylo in learn.java
Ну и третий вопрос сразу
источник

V

Vitaly Nechitaylo in learn.java
А какое отношение будет, если у инженера будет таблица с номером кузова автомобиля и номером двигателя, в него установленного?
источник

V

Vitaly Nechitaylo in learn.java
Еще раз повторю. Это про не геттеры/сеттеры, это про абстракцию
источник

K

Konstantin in learn.java
понимаю
источник

AS

Artyom Serdyuk in learn.java
Vitaly Nechitaylo
А если в автомобиле используется двигатель, один из тех, что сейчас собирают на конвейре и каждый имеет серийный номер?
то у вас все равно будет dependency injection в конструкторе вашего автомобиля. Вы будете передавать абстрактный двигатель. А в моментк конкретного создания обьекта автомобиля, вы определите, какой именно двигатель куда будет установлен
источник

K

Konstantin in learn.java
А какое отношение будет, если у инженера будет таблица с номером кузова автомобиля и номером двигателя, в него установленного?

Здесь будет агрегация, так как есть некий список
источник