¿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?
Respuesta
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.
¿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
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. –
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.
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 { ... }
...
}
Me gusta tu segundo ejemplo. –
@JordanStewart - Gracias. Es un ejemplo muy simplificado de algún código del mundo real. –
- 1. ¿Qué es una interfaz privada?
- 2. ¿Cuándo quisiera que mi clase privada sea estática?
- 3. Decisiones de diseño de ZeroMQ
- 4. ¿Puedo hacer que una variable de miembro público sea privada en una clase derivada?
- 5. Hacer una instancia de enumeración privada
- 6. ¿Cómo hacer que una API de servicio web público sea privada?
- 7. ¿qué puede hacer que pdb.set_trace() sea ignorado?
- 8. ¿Cuándo y por qué las entidades JPA deberían implementar una interfaz Serializable?
- 9. ¿Por qué no puedo hacer que String sea una instancia de una clase de tipo?
- 10. ¿Puedo implementar una interfaz que contenga una propiedad que sea de tipo hijo a la requerida por la interfaz?
- 11. ¿Por qué hacer que un miembro privado de la clase interna sea público en Java?
- 12. Herencia privada VS composición: cuándo usar qué?
- 13. Código de refabricación: ¿Cuándo hacer qué?
- 14. Decisiones de diseño/consejos para un juego simple en Android
- 15. Hacer que XStream ignore una variable privada específica
- 16. ¿Cuándo y por qué usas @interface ClassName (Private)? - Objective-C
- 17. Decisiones de herencia/interfaz para el motor de física
- 18. ¿Cuándo desechar y por qué?
- 19. Cómo hacer que mi código sea rápido
- 20. ¿Cómo hacer una URL privada?
- 21. Hacer que una lista enlazada sea segura
- 22. ¿Dónde comienza su diseño: código, interfaz de usuario, flujo de trabajo o lo que sea?
- 23. ¿Cómo hacer una propiedad privada?
- 24. ¿Por qué desechar StreamReader hace que una secuencia sea ilegible?
- 25. ¿Por qué deberías evitar que una clase sea subclasificada?
- 26. ¿Qué puedo hacer con una variable estática protegida/privada?
- 27. ¿Cómo puedo hacer que un método sea privado en una interfaz?
- 28. ¿Cuándo y por qué debería usar TStringBuilder?
- 29. ¿Por qué y cuándo necesito Azure?
- 30. Hacer que la carpeta no sea administrada por el SVN
cuando la interfaz se trata de algo que debe abstraerse de todo el código que no está en un paquete específico? – thejh
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