Это агрегация?

У меня есть следующий код

 public static void main(String[] args) {
    Engine engine = new Engine("This Engine!");
    Car b = new Car(engine);

    b = null;
}

Это агрегация? Я всегда думаю, что агрегация - это когда что-то все еще может "жить", даже если другой класс "уничтожен"... так, например, Car и Engine. если я удалю экземпляр Car, Engine все еще может жить.

Это правильно?


person user3549524    schedule 23.03.2015    source источник
comment
кажется, вы все неправильно поняли, потому что агрегация связана с отношениями, или, может быть, вы пытаетесь передать это   -  person Kick Buttowski    schedule 23.03.2015


Ответы (2)


Во-первых, я бы сказал, что ваш код будет выглядеть лучше, если вы сделаете

Car b = new Car();
b.setEngine(engine);

выглядел бы лучше.

Тогда что касается вашего агрегирующего мышления, да, вы правы. "Как-то". Но это если вы действительно разбиваете свои "объекты" на мелкие части. Я имею в виду, будет ли у вас машина, если у нее нет двигателя? :)

На самом деле я бы увидел машину такой, какая она есть, я бы скорее подумал, что это совокупность Машины и Водителя. Если автомобиль поврежден, у вас есть водитель. И даже если Водитель умрет, у вас все равно будет Машина.

От uml об агрегации:

Агрегация — это вариант ассоциативного отношения «имеет»; агрегация более специфична, чем ассоциация. Это ассоциация, которая представляет отношения часть-целое или часть-отношения. Как тип ассоциации, агрегация может быть названа и иметь те же украшения, что и ассоциация. Однако агрегация не может включать более двух классов; это должна быть бинарная ассоциация.

Агрегация может происходить, когда класс является коллекцией или контейнером других классов, но содержащиеся в нем классы не имеют сильной зависимости жизненного цикла от контейнера. Содержимое контейнера не уничтожается автоматически при уничтожении контейнера.

состав/агрегация

Еще одно отношение, которое путают с агрегацией, — это состав. Когда агрегация описывает отношение «имеет», композиция выполняет отношение «содержит/часть». Как я уже сказал, обычно двигатель является частью нужного вам объекта автомобиля (состава). Объект Car имеет Driver (агрегацию).

person MrSimpleMind    schedule 23.03.2015
comment
Замечательно объяснили, спасибо! Могу я попросить вас также объяснить, к чему всегда относится форма полого ромба? Я как бы не всегда это понимаю .. кстати: я приму ваш ответ, но мне нужно подождать еще несколько минут: D - person user3549524; 23.03.2015
comment
Добро пожаловать, полая ромбовидная форма, например. Автомобиль ‹›----› Водитель, если это то, о чем вы спрашиваете? ромб близок к форме автомобиля. - person MrSimpleMind; 24.03.2015
comment
Я не совсем понимаю, с какой стороны я должен поставить полый (или заполненный) ромб. - person user3549524; 24.03.2015
comment
Заполненный ромб предназначен для композиции, см. мой ответ. Дупло для агрегации. - person MrSimpleMind; 24.03.2015
comment
Я, наверное, слишком глуп, чтобы выражаться. У меня проблемы, когда дело доходит до решения, какой стороной должен быть бриллиант... если я должен поместить его рядом с классом X или классом Y. - person user3549524; 24.03.2015
comment
Нет проблем, это не так просто, но после некоторой практики вы это поймете. Алмаз должен быть ближе к машине. Автомобиль (закрашенный ромб) состоит из 1 части — двигателя. Автомобиль (закрашенный ромб) состоит из 4 частей, которые являются уровнями. У автомобиля (полый ромб) один водитель. - person MrSimpleMind; 24.03.2015
comment
Хорошо, большое спасибо за вашу помощь. Теперь я чувствую себя в полной безопасности перед завтрашним экзаменом! :) - person user3549524; 24.03.2015

что-то все еще может "жить", даже если другой класс "уничтожен".

Да, Агрегация — это когда B существует независимо от A, например, Сотрудник все еще существует без своего Менеджера.

Композиция сильнее, когда объект А «владеет» Б. Б не имеет никакой цели, кроме как по отношению к А.

person APD    schedule 23.03.2015