In a language where both are available, would you prefer to see an instance constructor or a static method that returns an instance?
For example, if you're creating a String
from a char[]
:
String.FromCharacters(chars);
new String(chars);
Static constructors allow you to initialize static variables in a class, or do other things needed to do in a class after it's first referenced in your code. They are called only once each time your program runs. Instance constructors are the ones that are called whenever you create new objects (instances of classes).
Static factory methods can encapsulate all the logic required for pre-constructing fully initialized instances, so they can be used for moving this additional logic out of constructors. This prevents constructors from performing further tasks, others than just initializing fields.
The main disadvantage of providing only static factory methods is that classes without public or protected constructors cannot be subclassed.
The factory method is a smart way to create objects in Java and provides several advantages over the traditional approach of creating objects using constructors in Java. It can also improve the quality of code by making the code more readable, less coupled, and improves performance by caching.
In Effective Java, 2nd edition, Joshua Bloch certainly recommends the former. There are a few reasons I can remember, and doubtless some I can't:
The downsides:
I write a constructor when creating the instance has no side effects, i.e. when the only thing the constructor is doing is initializing properties. I write a static method (and make the constructor private) if creating the instance does something that you wouldn't ordinarily expect a constructor to do.
For example:
public class Foo { private Foo() { } private static List<Foo> FooList = new List<Foo>(); public static Foo CreateFoo() { Foo f = new Foo(); FooList.Add(f); return f; } }
Because I adhere to this convention, if I see
Foo f = Foo.CreateFoo(); Bar b = new Bar();
while reading my code, I have a very different set of expectations about what each of those two lines is doing. That code isn't telling me what it is that makes creating a Foo different from creating a Bar, but it's telling me that I need to look.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With