I have an interface called Work
public class interface Work {
    boolean completeWork(Job j);
}
Then I have a Composite class
public class CompositeWork implements Work {
    private Set<Work> childWork = new HashSet<>();
    public boolean completeWork(Job j) {
        return childWork.stream().allMatch(w -> w.completeWork(j));
    }
    public void addWork(Work w) {
        childWork.add(w);
    }
}
I have a different Work types are the follwoing:
public class EasyWork implements Work {
    public boolean completeWork(Job j) {
        <do some work>
    }
} 
public class HardWork implements Work {
    private String id;
    public Hardwork(String id) {
        this.id = id;
    }
    public boolean completeWork(Job j) {
        <do some work>
    }
} 
Client populate CompositeWork something like this
public class Client {
    public static void main(String[] args) {
        CompositeWork workHolder = new CompositeWork();
        workHolder.add(new EasyWork());
        workHolder.add(new EasyWork());
        workHolder.add(new HardWork("1"));
        workHolder.add(new HardWork("2"));
    }
}
To enforce uniqueness of childWork in CompositeWork in HashSet<>() where do i implement hashcode() and equals()?      
Does that occur in Work interface?
CompositeWork class?
or is it implemented inside EasyWork and HardWork?     
 
     
     
    