2011-01-01 11 views
11

¿Alguna vez se han utilizado interfaces privadas en las decisiones de diseño? Si es así, ¿cuáles son los motivos y cuándo conoce la necesidad de una interfaz privada?Decisiones de diseño: ¿por qué y cuándo hacer que una interfaz sea privada?

+0

cuando la interfaz se trata de algo que debe abstraerse de todo el código que no está en un paquete específico? – thejh

+3

Una interfaz solo puede ser privada si es una interfaz anidada. Una clase o interfaz de nivel superior puede ser pública o privada de paquete. – Mot

Respuesta

3

En mi humilde opinión No puede hacer que una interfaz sea privada.

Sin embargo, a menudo tengo dos interfaces, una para uso público y otra para uso interno. La interfaz de uso interno hago el paquete local si es posible, p.

public interface MyInterface { 
    public void publicMethod(); 
} 

interface DirectMyInterface extends MyInterface { 
    public void internalUseOnlyMethod(); 
} 

Los métodos de uso interno exponga métodos que no quiero otros desarrolladores usar y/o Quiero ser capaz de cambiar fácilmente. La razón por la que tengo la interfaz es porque tengo varias implementaciones que quiero usar internamente a través de una interfaz.

+2

¿Para qué propósito necesita el paquete de uso interno? En más de 10 años de experiencia en Java, nunca tuve este patrón, pero dices que lo usas ** a menudo **. – Mot

+2

A menudo escribo bibliotecas o marcos utilizados por otros desarrolladores. Quiero mantener las interfaces lo más simples posible, así que cualquier método que pueda esconder lo hago especialmente. si no están destinados a ser utilizados por otros desarrolladores. –

1

Tiene que estar protegido por paquete si la interfaz es para uso interno. En general, si la interfaz no tiene ningún interés fuera de su ámbito, es una buena decisión de diseño de API to hide it porque hay menos complejidad para los usuarios de la interfaz y también permite refactorizarla más fácilmente, porque cuando la interfaz es pública y está en el API pierdes la libertad de cambiarlo.

4

A interfaz de nivel superior no puede ser privado. Solo puede tener public o acceso al paquete. De los Java Language Specification, section 9.1.1: "Interface Modifiers":

Los modificadores de acceso protegidas y privadas pertenecen sólo a las interfaces miembros cuyas declaraciones se adjunta directamente por una declaración de la clase (§8.5.1).

A interfaz anidada puede ser private siempre que y sus subclases, si los hay, son un detalle aplicación de su clase de nivel superior.

Por ejemplo, la interfaz anidada CLibrary a continuación se usa como un detalle de implementación de la clase de nivel superior. Se usa exclusivamente para definir una API para JNA, comunicada por la interfaz Class.

public class ProcessController { 
    private interface CLibrary extends Library { 
     CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); 
     int getpid(); 
    } 

    public static int getPid() { 
     return CLibrary.INSTANCE.getpid(); 
    } 
} 

Como otro ejemplo, esta interfaz privada define una API utilizada por clases privadas anidadas que implementan símbolos de formato personalizados.

public class FooFormatter { 
    private interface IFormatPart { 
     /** Formats a part of Foo, or text. 
     * @param foo Non-null foo object, which may be used as input. 
     */ 
     void write(Foo foo) throws IOException; 
    } 

    private class FormatSymbol implements IFormatPart { ... } 

    private class FormatText implements IFormatPart { ... } 

    ... 
} 
+0

Me gusta tu segundo ejemplo. –

+0

@JordanStewart - Gracias. Es un ejemplo muy simplificado de algún código del mundo real. –

Cuestiones relacionadas