Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Static factory disadvantage over constructor [closed]

I am going through Effective Java. The very first item makes a convincing case for static factory methods over constructors.

I didn't get the first disadvantage which is

The main disadvantage of providing only static factory methods is that classes without public or protected constructors cannot be subclassed.

Why do i need to subclass the class having static factory method since static methods can't be inherited?

Can someone please explain.

like image 538
Anand Avatar asked Dec 25 '22 18:12

Anand


2 Answers

Suppose you have a class called Person:

class Person {
  public static Person createWithFirstName(String firstName) {
    return new Person(firstName, null, null);
  }
  // etc. - more factory methods

  // private constructor
  private Person(String firstName, String lastName, String nickname) { }

  // useful method
  public String getDisplayName() { }
}

It's all good and dandy. But now you also need a class called Programmer, and you suddenly realize the programmers are persons too!

But all of a sudden, you can't just

class Programmer extends Person { }

since Person doesn't have any public constructors.

like image 82
iluxa Avatar answered Dec 28 '22 11:12

iluxa


For an instance of the subclass to be created, its constructor must be invoked.

And the first thing a constructor must do is to call one of its parent class constructor (the compiler inserts a call to super() for you if you don't explicitely add it).

If all the parent class constructors are private, the subclass can't call any of them, making the parent class effectively final, i.e. impossible to subclass.

like image 24
JB Nizet Avatar answered Dec 28 '22 11:12

JB Nizet