Кодирование композиции в Java - PullRequest
0 голосов
/ 12 июня 2018

Композиция - это целое / частичное отношение.Распространенным способом кодирования композиционных отношений является создание объекта части в конструкторе составного (целого) объекта.Пример в java:

public class Car {

private String brand;
private ArrayList<Tire> theFourTires = new ArrayList<Tire>();

public Car(String brand)
{
    this.brand = brand;
    for (int i = 1; i < 5;i ++)
    {
        // here the "composition" relationship
        theFourTires.add(new Tire());
    }
}

Когда мы хотим решить, какие объекты будут частями, мы можем использовать метод add ... , чтобы добавить объект детали в составной элемент.Вы должны соблюдать это правило (спецификации UML): объект части не может быть общим (на него ссылается другой объект, кроме составного).Итак, я думаю, что лучше, когда вы вызываете метод add, чтобы не иметь ссылки на объект part в методе, вызывающем метод add, как в классе Car:

public void addPart(CarParts aPart)
{
    this.parts.add(aPart);
}

метод add из другого объекта:

Car c = new Car("Ford Torino");
c.addPart(new Tire());

вместо

Tire t = new Tire();
c.addPart(t);

, потому что в этом случае экземпляр является общим по ссылке t, даже если он находится в течение очень короткого времении композиционные отношения становятся агрегацией.В этом случае вы можете вызвать метод для объекта t и нарушить инкапсуляцию объекта part.Объекты детали должны управляться только композитом.Что Вы думаете об этом ?Спасибо миру!

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Данная ассоциация может быть или не быть навигационной, и может быть или не быть композицией.Если он судоходный, то что-то еще может перемещаться по нему и добраться до цели ассоциации (шины) от источника (автомобиля).Навигация не влияет на то, является ли связь композицией.Инкапсуляция обеспечивает навигацию, а не композицию.

0 голосов
/ 12 июня 2018

Не лучше ли создать защитную копию в методе addPart ()?Примерно так:

public void addPart(CarParts aPart)
{
    this.parts.add(new CarParts(aPart);
}

Полагаю, вы хотите, чтобы они были недоступны для всех.

0 голосов
/ 12 июня 2018

Я не думаю, что это вообще имеет значение, поскольку, если у вас есть геттер для доступа к вашим 4 шинам, вы можете получить ссылку на объект Tire, который больше не управляется Car.

Поскольку в Java нет оператора delete, объект Car не имеет возможности удалять объекты 4 Tire, с которыми он связан, и, следовательно, нет необходимости в композиционном типе отношений.и это невозможно реализовать ни в одном коде.

...