Effective Java By Joshua Bloch: Item1 - Static Factory Method

后端 未结 6 613
猫巷女王i
猫巷女王i 2020-12-13 05:20

I am reading the Effective Java by Joshua Bloch and I have question about Item1 Static Factory Method.

Quote[Bloch, p.7]<

相关标签:
6条回答
  • 2020-12-13 05:35
    1. Interfaces cant have static methods, so by convention, static factory methods for an interface named Type are put in non-instantiable class named Types.

      The point is just the plural 's' on "Type[s]". So if your interface is called Foo and you want to create some implementation called MyFoo then your factory with the methods to instantiate should be called Foos by convention.

    2. The classes of the returned objects are all non-public

      This means that the classes of objects returned from the factory methods have a private or default visibility modifier as in private class MyFoo{} so that they can not be instantiated by any other means but their factory methods. Since you can't construct an Object using the new operator from private inner or package private class out of their scope (reflection aside).

    e.g.:

     public interface Foo{ //interface without plural 's' (question 1)
         public void bar();
     }
     public abstract class Foos(){ // abstract factory with plural 's' (question 1)
        public static Foo createFoo(){
            return new MyFoo();
        }
        private class MyFoo implements Foo{ // a non visible implementation (question 2)
           public void bar(){}
        }
     }
    
    0 讨论(0)
  • 2020-12-13 05:36

    Let's say you have an interface called List and you want to use the static factory method to create different type of lists. You cannot define the static factory methods in the List interface because it's an interface. So what you have to do it have a class that return instances of classes that implement List

    public class ListFactory{
      private ListFactory(){}
      public static List makeArrayList(){...}
      public static List makeLinkedList(){...}
      public static List makeCrazyList(){...}
    }
    

    You cannot do this

    public interface List{
       public static List makeArrayList();
       public static List makeLinkedList();
       public static List makeCrazyList();
    }
    

    Since List is interface.

    0 讨论(0)
  • 2020-12-13 05:41

    It simply means that the return type of the static factory methods in Collections (and other classes like it) are interface types (e.g. List) rather than specific implementation classes (e.g. java.util.Collections.UnmodifiableList), which are not visible to users since that would just complicate things and increase the size of the API.

    0 讨论(0)
  • 2020-12-13 05:50

    1) I don't understand your question here. Collection is the interface and Collections has some factory methods like emptyList

    2) E.g the List instance that is returned by Collection.emptyList is an instance of a private class that implements the List interface.

    0 讨论(0)
  • 2020-12-13 05:58
    public interface Foo
        static public class Factory
            public Foo create(){..}
    
    Foo foo = Foo.Factory.create();
    
    0 讨论(0)
  • 2020-12-13 06:00

    So take for example Collections.unmodifiableList(...). It returns some implementation of List. But the implementation class's name is irrelevant. Furthermore, said class is only constructed through the static factory method.

    0 讨论(0)
提交回复
热议问题