2012-01-12 10 views
8

En un problema actual estoy teniendo (printing a file to a physical printer in Java) He estado ejecutando el código como un loco tratando de devorar cualquier información perdida útil del javadoc de cada clase utilizada.¿Inicializar una interfaz?

Ahora, saqué bastante de este código de las preguntas anteriores, por lo que hubo un poco que no escribí yo mismo. El problema que noté es que el código que agarré está inicializando un objeto, digamos "SimpleDoc" que implementa una interfaz (Doc) y lo asigna a esa interfaz?

Poco Fragmento de código:

Doc mydoc = new SimpleDoc(textStream, flavor, null); 

Ahora por lo que me llevó a entender en Java creamos objetos. Estoy familiarizado con la herencia y estoy familiarizado con el truco de usar interfaces para permitir que una clase "herede" varias súper clases.

Pero esto simplemente no se está pegando bien. Puedes crear una clase que implemente una interfaz, eso está bien conmigo. Pero, ¿qué está sucediendo aquí cuando se crea una interfaz y un objeto se reduce a su interfaz? ¿A qué estoy accediendo cuando hago referencia a mydoc exactamente?

+2

mydoc es una referencia a un objeto que implementa la interfaz 'Doc'. En esta situación, la interfaz se utiliza para identificar los métodos que se pueden llamar a través de la variable de referencia mydoc. Tenga en cuenta que la variable (mydoc) sigue siendo una referencia a un objeto. – DwB

Respuesta

5

El truco es darse cuenta de que no está "creando", "creando instancias" o "inicializando" una interfaz. Simplemente está definiendo una variable como algo que sabe que implementa esa interfaz.

le están diciendo esencialmente otros programadores que trabajan en este código que para el resto de este método, que sólo están interesados ​​en el hecho de que es un myDocDoc (es decir, algo que satisface la interfaz Doc). Esto puede simplificar la programación porque el autocompletado del IDE ahora solo le mostrará los métodos definidos por esta interfaz, en lugar de todo lo que un SimpleDoc es capaz de hacer.

Imagine que en el futuro desea ampliar su funcionalidad para que pueda tener diferentes implementaciones de Doc dependiendo de alguna entrada. En lugar de crear el SimpleDoc explícitamente, que dice:

Doc mydoc = docFactory.getByType(inputType); 

El docFactory puede producir cualquier tipo de Doc, y este método no le importa qué tipo consigue instancia, porque va a tratarlo como un Doc independientemente.

+0

Una ventaja más. Si decide, en el futuro, utilizar un ComplexDoc o un MySuperOptimizedDoc, solo necesita cambiar el lado derecho de una línea de código. – user949300

+0

@ user949300: Bueno, podría decirse que cambiar los lados derecho * e izquierdo * de una línea de código no es mucho más difícil. Pero al programar en una interfaz en primer lugar, no se invita a los desarrolladores a que comiencen a llamar a los métodos en el 'SimpleDoc' que no se podrían ejecutar en ningún otro tipo de' Doc'. Como usted señala, esto ayuda a reducir la cantidad de refactorización que debería realizar si cambia el tipo de documento. – StriplingWarrior

+0

¡Gracias, ahora está mucho más claro! Disfruté el conocimiento general de cómo esta práctica ayuda a hacer que el uso de un objeto sea más claro, lo que realmente ayuda a explicar por qué usar ciertas prácticas como esta. – Alex

4

No puede crear interfaces, lo que usted hace aquí es crear un objeto mydoc de la clase SimpleDoc que implementa la interfaz Doc. Como la clase implementa esta interfaz, puede manejar mydoc como si fuera una instancia de esa interfaz. Esto le permite acceder a todos los métodos declarados en la interfaz, que se implementan en la clase SimpleDoc

Si, por ejemplo, el doc-Interface se vería así:

public interface Doc { 
    void print(); 
} 

y su clase SimpleDoc se vería de esta manera:

public class SimpleDoc implements Doc { 

    public void clear() { ... } 

    @Override 
    public void print() { ... } 

} 

... entonces sólo se podía acceder al print() -method de que mydoc -objeto. Pero también podría decir:

SimpleDoc mydoc = new SimpleDoc(); 

...y luego también podría llamar al clear()

Cuestiones relacionadas