Java 8/9 Best Practices — Part-1 (Static Factory Methods)
Should Consider Static Factory Methods for Creating Objects
There are various ways to create the objects in java, In a traditional way for the class to allow a client to create an instance is to provide the public default constructor. However, there is another way to create an instance of the Class. A class can provide a static public method which is a static method that returns the instance of the class. Let's see the example
     Java 
   
 
     
   
          x 
         
 
         
              1 
            
 
           public static Boolean valueOf(boolean a){ 
          
              2 
            
 
             return a ? Boolean.TRUE : Boolean.FALSE; 
          
              3 
            
 
           } 
          There are various advantages and disadvantages to consider Static Methods -
Advantages
- Static Methods have a name
 - Not required to create an object every time it gets invoked
 - They can return an object of any subtype of their return type
 - Class of the returned object can vary from call to call as a function of the input parameters
 - Class of the returned object need not exist when the class containing the method is written
 
Limitations
- A class without public or protected constructor can not be sub-classed if we only expose static Method for object creation
 - It could be difficult for the programmer to find the method where the object is being created unlike a constructor
 
Some common names for static factory methods
     Java 
   
 
     
  xxxxxxxxxx 
          
             1 
           
 
          
              1 
            
 
           Date d = Date.from (instance); //from 
          
              2 
            
 
           Set<Status> statuses = EnumSet.of(INITIATED, INPROGRESS,COMPLETED);//Use of Of 
          
              3 
            
 
           String str1 = String.valueOf(Integer.MAX_VALUE); // use of valueOf 
          
              4 
            
 
           Object newArray = Array.newInstance(classObject, length) // use of newInstance 
          
              5 
            
 
           BufferedReader br = Files.newBufferedReader(path);//use of newType 
          
              6 
            
 
           Both Static factory methods and public constructors both have their users. Static factories are preferable, so avoid the defining public constructor and think if Static factories can be used.
Ref - Effective Java - Third Edition by Joshua Bloch

