It's definitely important. My point is simply questioning whether it's really critical to always get it right from day one. Certain types of refactoring like public -> private really aren't always that hard in a closed system. I've done it many times with a few clicks in my IDE. Of course the difficulty depends on the nature of the change and the type of abstraction you need modify; but to me the difference between public and private is pretty low on the list of things that create big headaches. Especially in Java where unless you're using immutable objects everywhere, hiding something behind a getter that performs no additional logic is often useless.