Подтвердить что ты не робот

Эффективная Java Джошуа Блох: Item1 - Статический метод Factory

Я читаю Effective Java Джошуа Блоха, и у меня вопрос о Item1 Static Factory Method.

Цитата [Bloch, p.7]

Интерфейсы не могут иметь статические методы, поэтому по соглашению, статический factoryметоды для интерфейса с именем Type помещаются в небезопасный класс названных типов. Например, Java Рамки коллекций, немодифицируемые коллекции, синхронизированы коллекций и т.п. Почти все этих реализаций являются экспортными с помощью статических методов factory в одном неинтересный класс (java.util.Collections). Классы всех возвращенных объектов непубличный.

Ok. Когда смотрю на исходный код, я вижу java.util.Collection интерфейс и java.util.Collections класс с частным конструктором (не-экземпляр класса). и я вижу, что у неинтуитивных классов Collections есть все статические методы, точно так же, как сказал Блох. Но я не вижу связи между двумя классами, как сказал Блох.

Интерфейсы не могут иметь статические методы, поэтому по соглашению статические методы factory для интерфейса с именем Type помещаются в небезопасный класс с именем Типы.

  • Может ли кто-нибудь указать на очевидное для меня?

  • что это значит, когда он сказал

Классы возвращаемых объектов не являются общедоступными

Здесь я получаю java-источники: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av=f

4b9b3361

Ответ 1

  • Интерфейсы не могут иметь статические методы, поэтому по соглашению статические методы factory для интерфейса с именем Type помещаются в небезопасный класс с именем Типы.

    Точка - это просто множественное число 'on' Type [s] ". Поэтому, если ваш интерфейс называется Foo и вы хотите создать некоторую реализацию под названием MyFoo, то ваш factory с методами для создания экземпляра должен быть вызван Foos по соглашению.

  • Классы возвращаемых объектов не являются общедоступными

    Это означает, что классы объектов, возвращаемые из методов factory, имеют частный или стандартный модификатор видимости, как в private class MyFoo{}, так что они не могут быть созданы каким-либо другим способом, кроме их методов factory. Поскольку вы не можете построить объект с помощью оператора new из частного внутреннего или пакетного частного класса из области видимости (отвлекаясь).

например:.

 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(){}
    }
 }

Ответ 2

Скажем, у вас есть интерфейс под названием List, и вы хотите использовать статический метод factory для создания разных типов списков. Вы не можете определить статические методы factory в интерфейсе List, потому что это интерфейс. Итак, что вам нужно сделать, это класс, возвращающий экземпляры классов, которые реализуют List

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

Вы не можете сделать это

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

Так как List является интерфейсом.

Ответ 3

Возьмем, например, Collections.unmodifiableList(...). Он возвращает некоторую реализацию List. Но имя класса реализации не имеет значения. Кроме того, указанный класс создается только с помощью статического метода factory.

Ответ 4

public interface Foo
    static public class Factory
        public Foo create(){..}

Foo foo = Foo.Factory.create();

Ответ 5

1) Я не понимаю ваш вопрос здесь. Collection - это интерфейс, а Collections имеет некоторые методы factory, такие как emptyList

2) Например экземпляр List, возвращаемый Collection.emptyList, является экземпляром частного класса, который реализует интерфейс List.

Ответ 6

Это просто означает, что тип возвращаемого значения статических методов factory в Collections (и других подобных классах) - это типы интерфейса (например, List), а не конкретные классы реализации (например, java.util.Collections.UnmodifiableList), что не видны пользователям, поскольку это просто усложнит ситуацию и увеличит размер API.