2010-03-05 14 views
9

Tengo el siguiente código:¿Debo poner una interfaz pública en un archivo separado?

import com.apple.dnssd.*; 

public interface IServiceAnnouncer { 
    public void registerService(); 
    public void unregisterService(); 
    public boolean isRegistered(); 
} 

class HelloWorld { 
     public static void main(String[] args) { 
       System.out.println("Hello, World!"); 
     } 
} 

Este código se guarda en un archivo llamado "HelloWorld.java". El compilador de Java se queja de este código. Escribe que la clase IServiceAnnouncer es pública y debe declararse en un archivo llamado "IServiceAnnouncer.java".

Tengo varias preguntas acerca de esto:

  1. ¿Por qué el compilador dicen que IServiceAnnouncer es una clase? Es una interfaz. ¿O la interfaz es un caso parcial de una clase?

  2. Si pongo la interfaz IServiceAnnouncer en un archivo separado llamado "IServiceAnnouncer.java" (como el compilador quiere), ¿cómo puedo usar desde el "HelloWorld.java"?

  3. ¿Qué significa public interface? ¿Cuál es la diferencia entre una interfaz pública y una no pública?

+0

No está relacionado con su pregunta, pero según las normas estándar de codificación Java, debe poner "I" delante de las interfaces. –

+1

@Steve Kuo: Buen consejo, pero es posible que tenga una palabra. :-) http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html – trashgod

Respuesta

13

Debe ponerlo en un archivo separado. De esta forma, es más fácil intercambiar en una implementación diferente, o hacer que las interfaces (la API de su sistema) estén disponibles para que otros puedan codificar sin conocer los detalles de su implementación, o tener que arrastrar dependencias relacionadas.

p. Ej. implementaciones de API comunes de Java, p. servlets - tendrá una implementación codificada en el paquete de interfaces proporcionado por Sun (en este caso javax.servlet)

¿Cómo puede usarlo desde su implementación? Al importarlo. Esto es innecesario si está en el mismo paquete y está compilando todas sus interfaces/implementaciones a la vez.

Tenga en cuenta que una interfaz se compila en un archivo .class de la misma manera que una implementación (lo que usted define usando class).

+3

Las interfaces no tienen que ser públicas. Pueden ser útiles dentro de un paquete, o incluso en privado dentro de una clase (he hecho esto para el patrón de estado). – erickson

+0

¡Por supuesto! Doh. Corregido Thx –

6

No tiene otra opción. Todas las clases/interfaces públicas deben estar en archivos llamados ClassOrInterfaceName.java.

0
  1. El problema con más de una clase definición en un archivo es el siguiente error, lo que puede ocurrir cuando se utiliza control de versiones y múltiples desarrolladores están trabajando en el mismo proyecto:

    duplicate class: X 
    class X { 
    

    Por lo tanto, es prefirió colocar clases públicas (y también no públicas, por cierto) en archivos separados. Esto reducirá la posibilidad de tener estos errores.

  2. Si está en la misma carpeta, simplemente use IServiceAnnouncer, si está en una carpeta diferente, import.

  3. public es visible desde todos los paquetes. No public significa un tipo de protected (mientras que la palabra clave protected está prohibida, ¡extraño!): Solo es visible desde el mismo paquete. Si no está seguro de qué es un paquete, consulte el Tutorial de Java.http://java.sun.com/docs/books/tutorial/java/package/packages.html

-1

1) El compilador se queja de que solo tiene 2 tipos de nivel superior públicas definidas. No puedes hacer eso en Java. Puede anidar la interfaz en su clase si lo desea, o hacerla no pública (visibilidad predeterminada), pero eso no es demasiado común en Java, y probablemente no sea demasiado útil aquí.

2) Deberá implementar la interfaz o tener acceso a un objeto que lo implemente.

3) Las interfaces pueden ser públicas o por defecto (paquete) de visibilidad. Los métodos en una interfaz no necesitan el modificador público ya que son públicos por defecto.

+0

3) no es cierto: no todas las interfaces de nivel superior (no anidadas) son públicas. Solo son públicos cuando se definen como públicos. ¡Intentalo! – Pindatjuh

+0

Sí, debería haber mencionado la visibilidad del paquete. – pkananen

+1

Puede definir tantas clases de nivel superior como desee en Java, simplemente es que las públicas deben coincidir con el nombre del archivo, lo que significa que solo puede declarar un tipo público de nivel superior en un archivo. –

1

El compilador usa el término "clase" un poco flojo. Un término más general podría ser "tipo". Supongo que el compilador usa el término "clase" porque produce archivos ".class" del mismo formato de cada declaración de tipo (class, interface y enum).

Una interfaz no tiene que ser public. Si se declara sin un modificador de acceso, solo se puede acceder a él dentro de su "paquete".

Un tipo de Java puede (debería) declararse en un paquete. Los paquetes son una colección de tipos de Java que deben compilarse e implementarse juntos. De forma predeterminada, todos los tipos de un paquete se importan implícitamente, por lo que si su interfaz está en el mismo paquete, estará disponible para la clase HelloWorld.

Cuando no declara un paquete, hay un tipo en el paquete predeterminado. Entonces, incluso si solo pone la interfaz IServiceAnnouncer en un archivo separado, estará disponible para HelloWorld. Simplemente compila ambos archivos al mismo tiempo.

3

Estas respuestas dan la vuelta en la dirección correcta.

  1. Sí, puede declarar varias clases en un archivo en Java.
  2. No puede declarar más de una clase pública, porque:
  3. El nombre de una clase pública debe coincidir con su nombre de archivo; este es su error de compilación

Es muy extraño en Java declarar múltiples clases en un archivo, aunque usted puede. No lo hagas

Pone IServiceAnnouncer en un archivo aparte e importe el nombre de la clase en HelloWorld.java. Simplemente los compila al mismo tiempo, pasando ambos nombres de archivo a javac. Eso funciona todo.

Una interfaz pública, como cualquier otra cosa que sea pública en Java, es un tipo que es visible y se puede usar desde cualquier otra clase. Sin "público", su visibilidad se denomina paquete-privado, lo que significa que solo las cosas en el mismo paquete pueden usarlo.

Cuestiones relacionadas