https://medium.com/javarevisited/complete-abstraction-in-java-which-approach-wins-and-why-d1d368c4cfd2