2010-11-10 13 views
14

Todavía proveniente de C++ Me resulta engorroso crear muchas clases pequeñas de ayuda y objetos. Principalmente porque tengo que tener un archivo por clase. Yo, básicamente, tienen una clase como esta:Por qué solo una clase por archivo

public class mySimpleClass { 
    public float[] numbers = new float[ 4 ]; 
} 

Y luego tengo esta clase:

public class myNotSoSimpleClass { 
    private mySimpleClass; 
    . 
    . 
    . 
} 

La segunda clase que no es tan simple es buena idea tener en su propio archivo. Sin embargo, la clase simple está conectada a la clase no tan simple y sería muy bueno no tener que tener esas pocas líneas de código en su propio archivo.

Así que para resumir, esto es lo que se podría hacer en C++:

public class myNotSoSimpleClass { 
    private struct mySimpleClass { 
     float numbers[ 4 ]; 
    } myStruct; 
    . 
    . 
    . 
} 

¿Es posible incrustar/utilizar una clase dentro de otra clase, o el mismo archivo? Me resultaría más fácil trabajar con proyectos grandes si pudiera configurar estas dos clases en un solo archivo. ¿O es Java estrictamente una clase por archivo, y eso es todo, el lenguaje?

+5

En Java, se acostumbra nombrar todos los nombres de clase con una letra mayúscula y todos los nombres de variable con una letra minúscula. Deberías llamar a tus clases 'MySimpleClass' y' MyNotSoSimpleClass'. –

+1

¿Por qué tienes una clase que no hace nada más que envolver una matriz, que también es una clase? – JeremyP

+0

@JeremyP: Es un ejemplo. Mi clase simple real tiene algunas variables, y mi clase no tan simple tiene mucho más código, incluidas las funciones. – Espen

Respuesta

14

Es posible tener una clase dentro de otra clase. En Java, se llama inner class

+0

¿Cuál sería la costumbre aquí? ¿Utiliza una clase interna para este tipo de clase de ayuda o una de esas clases privadas de paquete? – Espen

+0

Esto puede ser un buen camino a seguir, pero asegúrese de no necesitar esta clase en otro lugar primero. –

+1

Las clases internas son un tipo de clase anidada. También hay clases anidadas estáticas. –

3

Java le permite crear clases internas. Es decir, clases dentro de otra clase. Ahí es donde deberías poner tus clases de ayuda. Por otro lado, siento tu dolor. Al ser principalmente un codificador de C++, Java a veces puede parecer que obliga a repetirse.

15

Puede tener varias clases en el mismo archivo, pero sólo uno de ellos puede ser pública:

Java: Multiple class declarations in one file

+0

Puedes tener clases internas públicas, ¿qué estás tratando de decir? –

+6

Él no se está refiriendo en absoluto a clases internas, sino a clases de nivel superior adicionales. –

+0

"Solo uno de ellos puede ser público" es incorrecto. –

4

La regla es la clase pública de nivel superior por archivo. Clase interna, clase privada y algunas otras cosas están permitidas

+0

-1 Incorrecto. La limitación está en las clases de nivel superior solamente. –

+0

@Erick: ¿Cómo hace eso que su respuesta sea incorrecta? Dijo "clase privada", por lo que supongo que se refiere a una clase de nivel superior que no es pública. – Jay

+0

Puede presumir, porque entiende cómo funciona. Alguien que está tratando de comprender no puede hacer la misma presunción. –

5

La restricción es que solo puede tener una clase pública de nivel superior por archivo (aunque puede tener clases públicas anidadas). Como las personas han mencionado, puedes tener clases internas/anidadas dentro de esa clase.

Otra cosa que no se ha mencionado es que puede tener otra clase de nivel superior en el mismo archivo, siempre que sea de paquete privado (visible solo dentro del paquete). Una clase package-private es aquella que se declara sin un modificador de acceso.

Aquí hay un capítulo de Java efectivo (que vale la pena leer) sobre este tema. http://books.google.co.uk/books?id=ka2VUBqHiWkC&lpg=PA67&ots=yXKoLnv2TX&dq=Minimize%20the%20accessibility%20of%20classes%20and%20members&pg=PA67#v=onepage&q&f=false

+2

Incorrecto. Las clases anidadas pueden ser públicas. –

+0

Ah, mis disculpas. Olvidé sobre ese caso. Haré una edición de mi respuesta. – Sinjo

+0

El segundo párrafo sigue siendo incorrecto. Arregle eso y quitaré mi voto downvote. –

0

En Java hay algo llamado clases anidadas, ¡lea más about it here!

+0

-1 Formato deficiente para una respuesta. –

2

En Java, no hay forma de poner dos públicas clases de nivel superior en el mismo archivo, pero esta restricción no se aplica a clases privadas/internas. Por lo que podría tener algo como:

public class MyNotSoSimpleClass { 
    private MySimpleClass mySimpleClass = new MySimpleClass(); 

    private class MySimpleClass { 
     public float numbers[4]; 
     ... 
    } 
.... 

}

+1

Esto es falso. Es posible tener arbitrariamente muchas clases públicas en el mismo archivo fuente. Simplemente no es posible tener más de una * clase de nivel superior * en el mismo archivo. –

+0

Obviamente. Por lo tanto, clases privadas/internas. No digo que sean lo mismo. Las clases internas son, por definición * no * de nivel superior ... – nosirrahcd

+0

@Andy: Obviamente, el usuario468341 hablaba de clases de nivel superior. – chiccodoro

3

Sí, puede anidar una clase dentro de otra.

Contrariamente a muchas de las respuestas aquí, no hay restricciones a la visibilidad pública.

clases anidadas incluyen:

  • clases anidadas estáticas.
  • Las clases internas, que tienen un puntero implícito a una instancia de la clase contenedora, y se les permite acceder a sus partes privadas.
  • Clases internas anónimas, que pueden crearse dentro de los métodos de la clase contenedora, sin nombre. Estos son convenientes, por ejemplo, para oyentes de eventos cortos.

Más detalles están disponibles en este Oracle tutorial.

9

Como varios otros han señalado, puede tener cualquier número de clases no públicas en un único archivo.

Para responder al "por qué", un factor probable es que hace que sus clases sean fáciles de encontrar. Si veo una referencia en un programa para clasificar a Foobar, inmediatamente sé que debe estar en el mismo archivo que la clase actual o debe estar en un archivo llamado Foobar.java. Puedo verificar las importaciones para ver en qué directorio está.

Cuando trabajo en programas C o C++, regularmente me encuentro teniendo que hacer búsquedas de archivos de Windows o grep de Linux para encontrar el origen de una clase.

Cuando escribo programas muy pequeños, a menudo pongo todas las clases en un solo archivo. Pero si va a haber más de unos miles de líneas, es mucho más manejable romperlo.

Cuando tengo una clase que solo usa otra clase, a menudo la pongo en el mismo archivo. Por lo general, esto significa una clase que solo existe para almacenar temporalmente un pequeño conjunto de datos, como que necesito una matriz o una lista de algo que requiera más de un campo.

+1

La cantidad de tiempo que se tarda en crear un nuevo archivo por clase es pequeña en comparación con el ahorro de tiempo de poder encontrar el código sin buscar. No tiene que examinar varios niveles de #includes o intentar analizar manualmente el archivo MAKE para encontrar qué archivo tiene qué clase. +1 para la explicación. –

+0

Veo el punto de tener un archivo para cada clase. Sin embargo, nunca tuve tantos problemas para encontrar una clase en C++. Principalmente porque creo que hago nombres y espacios de nombres adecuados, y debido al ingenioso menú contextual en VS. Aunque mirar a través de las bibliotecas estándar o externas sería un dolor sin él. Cuando eso se dice, tener un archivo para cada una de diez o veinte clases de tres líneas sería una molestia. – Espen

+0

@Espen: Claro, puede parecer tonto tener que crear un archivo separado solo para mantener una clase pequeña. Pero vuelvo a mi punto original: una regla consistente hace que el código fuente deseado sea fácil de encontrar. Los IDE modernos pueden ayudar, pero no siempre uso un IDE para ver mi código. – Jay

Cuestiones relacionadas