2015-03-12 3 views
1

Я пытаюсь добавить элементы в ArrayList<Movements>movement как часть шаблона построителя.Добавление элементов в ArrayList с использованием шаблона builder в Java

Класс Movement содержит int movementId и String movementName, и я хотел бы, чтобы пользователь добавил их в композицию, используя шаблон строителя.

Я борюсь с реализацией, смотрите ниже:

public static class CompositionBuilder{ 
     private final String compositionId; 
     private List<Movements> movement = new ArrayList<Movements>(); 
     private final String compositionName; 
     private final String composerName; 

    public CompositionBuilder(String compositionId, String compositionName, String composerName){ 
     this.compositionId = compositionId; 
     this.compositionName = compositionName; 
     this.composerName = composerName; 
    } 

    //this part is where I am struggling. I don't know how to populate the ArrayList 
    public CompositionBuilder movement(Movements...movement){  
     for (Movements i : movement){ 
      this.movement.add(i); 
     } 
     return this; 
    } 

    public Composition build(){ 
     return new Composition(this); 
    } 
} 

Я хочу, чтобы иметь возможность построить композицию, используя

public class CompositionBuilderTest { 

    public static void main (String[] args){   

     Composition composition1 = new Composition.CompositionBuilder("1", "CompositionOne", "John Doe") 
                   .movement()//enter movement values here 
                   .build(); 
     System.out.println(composition1); 
    } 
} 

Состав Constructor:

private Composition(CompositionBuilder builder){ 
     this.compositionId = builder.compositionId; 
     this.movement = builder.movement; 
     this.compositionName = builder.compositionName; 
     this.composerName = builder.composerName; 
} 
+4

Какие проблемы вы видите с реализацией? – nomis

+0

В 'CompositionBuilderTest' я хочу ввести' движение (motionId, movementName) '. Это не работает. Я также не думаю, что аргумент переменной длины правильный в 'CompositionBuilder движении', но я не могу понять альтернативу. – Mac

+0

@macattack Вам нужно будет вызвать конструктор 'Movements':' motion (new Movements (motionId, motionName)) ' –

ответ

1

Использование CompositionBuilder для создания экземпляров Movement будет идти против SRP (и вам понадобится мода ify - подпись метода movement в построителе). Скорее всего, вы должны передать экземпляры движения в метод movement(Movement...movements), вызывая либо конструктор или завод

Composition composition1 = new Composition.CompositionBuilder("1", "CompositionOne", "John Doe") 
                  .movement(Movement.newInstance(id, name), Movement.newInstance(id2, name2)) 
                  .build(); 
Смежные вопросы