import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class KoleksiDihitungKomposisi {
    public static void main(String[] args) {
        SetDiukur<String> himpunan = new SetDiukur<>(new HashSet<>());
        himpunan.addAll(List.of("Budi", "Siti", "Dewi"));
        System.out.println("Jumlah elemen : " + himpunan.size());
        System.out.println("Tambah tercatat: " + himpunan.jumlahTambah());
    }
}

// Komposisi: memiliki Set, mendelegasikan pekerjaan kepadanya
class SetDiukur<E> {
    private final Set<E> set;
    private int jumlahTambah = 0;

    SetDiukur(Set<E> set) {
        this.set = set;
    }

    public boolean add(E e) {
        jumlahTambah++;
        return set.add(e);
    }

    public boolean addAll(Collection<? extends E> c) {
        int ukuranSebelum = set.size();
        boolean berubah = set.addAll(c);
        jumlahTambah += set.size() - ukuranSebelum;
        return berubah;
    }

    public int size() {
        return set.size();
    }

    int jumlahTambah() {
        return jumlahTambah;
    }
}
