2011-07-05 24 views
8

Me gustaría diseñar la clase A implementa la interfaz C y reducir la visibilidad de un método (declarado en C) para protegerlo del mundo exterior, realice uno de los métodos en la interfaz implementada en clase A como privado (reduciendo la visibilidad en la clase A). Tengo que hacer esto por razones de seguridad, ¿cómo puedo hacer esto ?, ¿hay alguna solución? Sabemos que, por defecto, la interfaz tiene miembros públicos. Pero no hay opción para mí, ¿alguien puede ayudarme? Gracias por adelantado.Reducir la visibilidad al implementar la interfaz en Java

- Así que, no hay forma de tener un método de implementación de clase desde la interfaz y hacerlo privado. Y todas las clases que implementan el método de cualquier interfaz siempre tendrán métodos públicos?

Respuesta

13

No, no puede reducir la visibilidad de un método en una interfaz. ¿Qué esperaría que ocurriera si alguien escribiera:

C foo = new A(); 
foo.methodDeclaredPrivateInA(); 

? En lo que respecta al compilador, todo lo que haga referencia a una implementación de C tiene derecho a llamar a cualquier método dentro de él, de eso se trata el Principio de sustitución de Liskov.

Si no desea implementar la totalidad de una interfaz pública, no la implemente, o genere excepciones si es absolutamente necesario.

Es también digno de mención que la accesibilidad prevista en el código fuente no suele ser una buena seguridad medida. Si su clase se ejecuta en una VM que a su vez determina sus propios permisos, cualquiera puede hacer que los miembros sean visibles mediante la reflexión.

+0

Así que no hay forma de tener un método de implementación de clase desde la interfaz y hacerlo privado. Y todas las clases que implementan el método de cualquier interfaz siempre tendrán métodos públicos? –

+0

@ user357349: Sí. Esa es la forma en que está diseñado. –

2

No se puede reducir la visibilidad del método de una interfaz en Java. ¿Es aceptable que implemente el método lanzando un java.lang.UnsupportedOperationException?

0

No se puede reducir del visiblity porque se podría escribir algo en la línea de

C newC = new A(); 
0

Este enfoque funcionó para mí. Cualquier nueva función añadida a PrivateInterface se rompería aún se rompió PublicSampleClass

private interface PrivateInterface { 
    void fooBar(); 
} 

public class PublicSampleClass { 

    private final listenerInterface = new PrivateInterface { 
     public void fooBar() { 
      PublicSampleClass.this.fooBar(); 
     } 
    }; 

    protected void fooBar() { 
     // Non public implementation 
    } 

} 
Cuestiones relacionadas