import java.util.ArrayList;
import java.util.List;

/**
 * Lee líneas con campos separados por ';'. El recorrido es siempre el mismo;
 * qué objeto se crea con cada línea lo decide la subclase en create
 * (Factory Method).
 */
public abstract class LineImporter<T> {

    public final List<T> importAll(List<String> lines) {
        List<T> result = new ArrayList<>();
        int number = 0;
        for (String line : lines) {
            number++;
            if (line.isBlank() || line.startsWith("#")) {
                continue;
            }
            String[] fields = line.split(";");
            if (fields.length != fieldCount()) {
                throw new IllegalArgumentException("línea " + number + ": se esperaban "
                        + fieldCount() + " campos y hay " + fields.length);
            }
            result.add(create(fields));
        }
        return result;
    }

    /** Cuántos campos tiene cada línea. */
    protected abstract int fieldCount();

    /** El factory method: crea el objeto de una línea. */
    protected abstract T create(String[] fields);
}
