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

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

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

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

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

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

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

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

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

Вот где я получаю исходные коды Java: http://grepcode.com/file/repository .grepcode.com / java / root / jdk / openjdk / 6-b14 / java / util / Коллекция. java? av = f

22
задан trashgod 25 May 2011 в 21:04
поделиться

2 ответа

  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(){}
    }
 }
26
ответ дан 29 November 2019 в 04:59
поделиться
public interface Foo
    static public class Factory
        public Foo create(){..}

Foo foo = Foo.Factory.create();
2
ответ дан 29 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: