java - скачать - джошуа блох эффективное программирование 3 издание




Эффективная Java от Джошуа Блоха: Item1-Static Factory Method (4)

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

Цитата [Блох, с.7]

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

Хорошо. При взгляде на исходный код я вижу интерфейс java.util.Collections класс java.util.Collections с закрытым конструктором (неинстанцируемый класс). и я вижу, что неинстанцируемый класс Collections имеет все статические методы, как сказал Блох. Но я не вижу связи между двумя классами, как сказал Блох

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

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

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

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

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


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

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

  2. Все классы возвращаемых объектов не являются публичными.

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

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

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


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


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







effective-java