2012-01-16 15 views
11

Soy un programador de C++ que actualmente estoy aprendiendo Java y me pregunto si OOP en Java sigue el mismo principio de separación de definición de clase y declaración que C++, es decir. colóquelos en archivos separados. He echado un vistazo a Internet, incluido el sitio web para desarrolladores de Android, y todo el código que he encontrado tiene la definición y la declaración llevadas a cabo al mismo tiempo.Archivos separados para la definición y declaración de clase en Java

¿Es esto simplemente una de las diferencias entre desarrollo en C++ y desarrollo en Java, o son las fuentes que he estado viendo simplemente haciendo las cosas de esa manera para limitar la complejidad de su código para publicar en Internet? He visto declaraciones y definiciones combinadas en algunos documentos de C++, aunque sé que es una mala práctica hacerlo.

+0

Bueno, usted tiene interfaces y su separación de implementación en Java. – anubhava

+2

¿Qué pasa con todos y las interfaces? Eso no es para lo que son. La separación de una sola clase en la interfaz y la implementación no tiene sentido: existen para permitir una forma ligera de herencia múltiple, para describir un comportamiento general que se puede implementar por separado. Esto es diferente de la separación de definición de C++ de una clase específica. – Viruzzo

+0

Separar una sola clase en la interfaz y la implementación tiene mucho sentido cuando la clase es "pesada" y desea una manera fácil de, por ejemplo, crear una simulación para su código de prueba. Por supuesto, hacerlo para clases muy simples puede ser excesivo. – Seramme

Respuesta

6

Hay una razón práctica para separar la declaración en C++, y es para permitir que los archivos fuente se compilen por separado. No existe tal necesidad en Java (ya que todo está compilado para bytecode por separado), por lo que no está permitido.

+2

Otra razón para la separación en C++, según recuerdo, es que puede darle a alguien la interfaz pública de su clase sin darles el código. En Java, estos metadatos están en el archivo '.class', por lo que no necesita un encabezado separado. – yshavit

+0

@yshavit cierto, por supuesto; todo se reduce a poder compilar sin tener que incluir la fuente de las otras clases (respectivamente para el rendimiento y por razones de seguridad). – Viruzzo

4

La respuesta a continuación se ha editado en gran medida en función de los comentarios.

No necesita dividir su clase en definición y declaración solo por el compilador, ya que no hay necesidad de declaraciones de reenvío en Java (como en C++). Es posible que desee dividir una definición de clase y la declaración en un par de interfaz/clase (o clases par [resumen]/clase), debido a los requisitos de diseño, tales como:

  • múltiples clases que implementan una única interfaz.
  • Llamadas a procedimientos remotos, donde no desea exponer ninguna de sus dependencias de clase (ya que pueden no estar disponibles en el lado del cliente)
  • Clase utilizada por otras clases, pero no necesita/quieren su funcionalidad cuando se prueba (ej. servicio de acceso a base de datos que es posible que desee para burlarse en su código de prueba)

Sin embargo, esto es más afín a la utilización de una clase base virtual y concreta aplicación de las clases en C++ y es a menudo llamado "programación a una interfaz". Puede leer más sobre la técnica in this article (con algunos argumentos allí por qué prefiere usar una clase abstracta en lugar de una interfaz como base). Además, dicha división debe considerarse cuidadosamente; en muchos casos, dividir una clase es una exageración pura y dará lugar a un exceso de código innecesario.

Por lo tanto, la respuesta corta es: no es necesario dividir la clase solo por el hecho de tener una declaración directa (que la pregunta original hace), aunque es posible que desee hacerlo si hay un motivo de diseño para (pero esto es no el equivalente de la división de archivos de cabecera/clase de C++).

+0

+1: utilice interfaces para separar el contrato de la implementación. –

+0

-1: Justificado si se necesitan múltiples implementaciones de MyService; de lo contrario, es una abstracción prematura (que es la raíz de mucho mal) –

+1

(para la edición) pero ese comportamiento es comparable a las clases abstractas puras de C++, que todavía no están directamente relacionadas con la separación de declaraciones. Comprenda que la principal fuente de controversia aquí es la parte de "lograr una funcionalidad similar": ¡estas funcionalidades no están directamente relacionadas! – Viruzzo

0

En Java tiene una clase en un archivo, es decir, no puede, y no necesita, dividir clases en varios archivos (aunque puede tener múltiples clases no públicas en un archivo).

Lo que puede hacer es usar interfaces, es decir, definir la interfaz para una clase en un archivo e implementar esa interfaz en una clase en otro archivo. Si luego distribuye la API, simplemente distribuya la interfaz.

0

No hay archivos de encabezado y fuente en Java como los que tiene en C++. Si desea separar la declaración de clase de su implementación, puede definir una interfaz que declare los métodos y luego crear una clase que implemente la interfaz.

+0

¿Por qué el voto a favor? ¿Solo porque todos respondieron lo mismo al mismo tiempo? – Jesper

+0

Porque todos dieron la respuesta "incorrecta". – Viruzzo

+1

Una gran cantidad de personas no están de acuerdo en que esta es una respuesta "incorrecta". – Jesper

0

La separación sobre la que escribe no existe en Java. Puede separar las definiciones de métodos (no estáticos) a interface.

2

En Java no tiene otra opción: el nombre de clase está vinculado al nombre del archivo.Para un archivo llamado x/y/z/T.java de la raíz de los archivos de origen, T.javadebe aspecto:

package x.y.z; 

[some modifiers here] class T { 
    // class T here 
} 

Hay maneras de separar "definición de clase" de "aplicación", el más cercano a lo que tiene en mente es declarando una interfaz I y teniendo una clase C implementando I. También considere clases abstractas.

Una interfaz tiene exactamente la misma restricción excepto que declara interface en lugar de class. Una clase abstracta es solo una clase con el modificador abstract.

0

No, este tipo de separación no está presente en Java. Pero mira la palabra clave de la interfaz. ¡puedes declarar interfaces explícitamente!

+0

No entiendo por qué -1. La respuesta es corta, pero ¿qué está mal? – ollins

Cuestiones relacionadas