I’m developing a simple tree-structured database and I’m usually setting dependencies or optional settings via a Builder (Builder pattern). Now I’m not sure when to use for instance Guice, when to use the Builder pattern and when to use a static factory method instead of the constructor itself. I’ve read Effective Java several times and I think it mentions at least a lot of advantages for not exposing the constructor. It’s time to reread 😉
So, do you know of cases which are clearly distinguishable? And shouldn’t I expose the constructor? Thus for instance in every case write public static Foo getInstance(...) { return new Foo(...)}?
I’m a firm believer in that you don’t need to use dependency injection for everything.
For a
LookupServiceit would be natural inject aDictionarysuch that its implementation can be swapped out by configuration.For a
Firewallon the other hand. It would be natural for it to create its ownFireWallRules, perhaps through a suppliedFactoryor aBuilder.As a guideline, inject what you need to configure, don’t automatically inject everything else.
Consider a
static factory (*)whenLists.newArrayList()Consider
instance factorieswhenAbstractFactorydesign patternConsider a
builderwhen(*)Static methods are not always testable and the presence of one should in my opinion always be motivated.A typical usecase for a factory is to decrease coupling. By using a
static factorythat ability is completely lost.