import java.util.Collection;
import java.util.ArrayList;
import java.util.LinkedList;

public class EnumTest2 {
  public static void main(String[] args) {
    StringCollection[] collections = new StringCollection[] {
      new StringCollectionImpl(
        StringCollectionImpl.InternalCollection.ARRAYLIST),
      new StringCollectionImpl(
        StringCollectionImpl.InternalCollection.LINKEDLIST),
      new StringCollectionImpl2(new ArrayList<String>()),
      new StringCollectionImpl2(new LinkedList<String>())
    };
    
    String[] names = { "Jahn", "Löberbauer", "Wolfinger" };
    
    for(StringCollection c: collections) {
      for(String s: names) {
        c.add(s);
      }
      Out.println(c);
    }
  }
}

interface StringCollection {
  void add(String s);
  String toString();
}

abstract class StringCollectionBase implements StringCollection {
  protected Collection<String> collection;
  public void add(String s) {
    collection.add(s);
  }
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("\n" + this.getClass().getName());
    for(String s: collection)
      sb.append("\n" + s);
    return sb.toString();
  }
}

class StringCollectionImpl extends StringCollectionBase {
  public enum InternalCollection { ARRAYLIST, LINKEDLIST };
  public StringCollectionImpl(InternalCollection internal) {
    switch(internal) {
      case ARRAYLIST:
        collection = new ArrayList<String>();
        break;
      case LINKEDLIST:
        collection = new LinkedList<String>();
        break;
    }
  }
}

class StringCollectionImpl2 extends StringCollectionBase {
  public StringCollectionImpl2(Collection<String> collection) {
    this.collection = collection;
  }
}
