diseño - ejercicios singleton java
Java efectivo por Joshua Bloch: Artículo 1-Método de fábrica estático (6)
Las interfaces no pueden tener métodos estáticos, por lo que, por convención, los métodos de fábrica estáticos para una interfaz llamada Tipo se colocan en una clase no instanciable llamada Tipos .
El punto es solo el plural ''s'' en "Tipo [s]" . Entonces, si su interfaz se llama
Foo
y desea crear una implementación llamadaMyFoo
entonces su fábrica con los métodos para crear instancias debería llamarseFoos
por convención.Las clases de los objetos devueltos no son públicas.
Esto significa que las clases de objetos devueltos por los métodos de fábrica tienen un modificador de visibilidad privado o predeterminado como en
private class MyFoo{}
para que no se puedan crear instancias de ninguna otra manera que no sean sus métodos de fábrica. Ya que no se puede construir un Objeto usando elnew
operador de una clase privada interna o de paquete fuera de su alcance (reflexión aparte).
p.ej:
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(){}
}
}
Estoy leyendo el Effective Java
por Joshua Bloch y tengo una pregunta sobre el Static Factory Method
.
Cita [Bloch, p.7]
Las interfaces no pueden tener métodos estáticos, por lo que, por convención, los métodos de fábrica estáticos para una interfaz llamada Tipo se colocan en una clase no instanciable llamada Tipos. Por ejemplo, el Java Collections Framework, proporciona colecciones no modificables, colecciones sincronizadas y similares. Casi todas estas implementaciones se exportan a través de métodos de fábrica estáticos en una clase no institucional (java.util.Collections). Las clases de los objetos devueltos no son públicas.
De acuerdo. Cuando miro el código fuente, veo la interfaz java.util.Collections
y la clase java.util.Collections
con un constructor privado (clase no instanciable). y veo que las Colecciones de clase no instanciables tienen todos los métodos estáticos, como lo dijo Bloch. Pero no veo la conexión entre las dos clases como dijo Bloch
Las interfaces no pueden tener métodos estáticos, por lo que, por convención, los métodos de fábrica estáticos para una interfaz llamada Tipo se colocan en una clase no instanciable llamada Tipos.
¿Alguien puede señalar lo obvio para mí?
que significa cuando dijo
Las clases de los objetos devueltos no son públicas.
Aquí es donde obtengo las fuentes java: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av=f
1) No entiendo tu pregunta aquí. Collection
es la interfaz y Collections
tiene algunos métodos de fábrica como emptyList
2) Por ejemplo, la instancia de lista que devuelve Collection.emptyList
es una instancia de una clase privada que implementa la interfaz de List
.
Así que tomemos por ejemplo Collections.unmodifiableList(...) . Devuelve alguna implementación de lista. Pero el nombre de la clase de implementación es irrelevante. Además, dicha clase solo se construye a través del método de fábrica estática.
Digamos que tiene una interfaz llamada List
y desea utilizar el método de fábrica estático para crear diferentes tipos de listas. No puede definir los métodos de fábrica estáticos en la interfaz de List
porque es una interfaz. Entonces, lo que tienes que hacer es tener una clase que devuelva instancias de clases que implementen List
public class ListFactory{
private ListFactory(){}
public static List makeArrayList(){...}
public static List makeLinkedList(){...}
public static List makeCrazyList(){...}
}
No puedes hacer esto
public interface List{
public static List makeArrayList();
public static List makeLinkedList();
public static List makeCrazyList();
}
Desde la List
es la interfaz.
Simplemente significa que el tipo de retorno de los métodos de fábrica estáticos en Collections
(y otras clases similares) son tipos de interfaz (por ejemplo, List
) en lugar de clases de implementación específicas (por ejemplo, java.util.Collections.UnmodifiableList
), que no son visibles para los usuarios ya que eso solo complicaría las cosas y aumentaría el tamaño de la API.
public interface Foo
static public class Factory
public Foo create(){..}
Foo foo = Foo.Factory.create();