2009-10-01 29 views
12

Fui a esta entrevista para un puesto de desarrollador de software y me dieron una prueba con algunas situaciones de código de esquina y caso, con generalmente 4 opciones para elegir.
Una de las preguntas tenía una enumeración declarada fuera del alcance de la clase, revisé rápidamente la respuesta "no compila" y seguí adelante con las otras preguntas. Era algo así como:Enum declaró fuera del alcance de clase

enum Colors {BLUE,RED,GREEN} 

class Test { 
    //other code, not really important with my question 
} 

Este código se compila en realidad.
Además del hecho de que una entrevista como esta (podría o no) sería útil para averiguar si uno es un buen desarrollador, lo que me preocupa es: ¿por qué declararía una enumeración como esta? ¿Por qué solo puedo hacer esto con enum? Hice algunas pruebas y descubrí que es visible dentro de la clase, pero no a otras clases.

Sidenote: Marqué realmente pobre: ​​P. Obtuve el máximo en la teoría, pero cerca de la más baja posible en las situaciones de código de caso de esquina. No creo que consiga el trabajo.

+3

Estará visible para otras clases en el mismo espacio de nombres, no solo dentro de un archivo. La mayoría de las enumeraciones en BCL se declaran fuera de una clase, al igual que el ejemplo que proporcionó (excepto que son públicas). Entonces la pregunta es ¿por qué * no * declaras una enumeración como esta? – Groo

+0

Es útil comprobar si alguien trabajó con el control de acceso de Java y las clases no son 100% del formulario public class A {private String field; public method() {}} de forma predeterminada. –

+0

@Groo: Sí, es –

Respuesta

10

No es solo enums. Los enum son solo clases especiales de clases. En general, puede tener varias clases declaradas en un archivo (siempre que no haya dos públicas).

+0

Y el nombre del archivo de clase se puede elegir libremente (por ejemplo, MyClass.java para el ejemplo). –

+0

Eché de menos el pasaje "Los enum son solo tipos especiales de clases", teniendo esto en cuenta, esto comienza a tener sentido. –

+0

En realidad, esto funciona para clases (no solo enumeraciones). –

0

Compila en realidad, en mi Eclipse! ;-)

Se permite que varias clases estén en el mismo archivo. La limitación es que una clase pública debe definirse en un archivo que tiene el mismo nombre.

Su visibilidad es 'paquete', por lo que debe ser visible en otras clases en el mismo paquete también.

¿Qué puedo hacer con esa enumeración?

Usted puede hacer lo que quiera con las limitaciones anteriores ...

Nota: a pesar de que lo tenía mal, usted no debe sentirse muy mal, porque es no es realmente una buena práctica ya sea. ¡En nuestra configuración de CheckStyle, las clases externas en el mismo archivo como este se tratan como errores!

+1

, por supuesto, compila. Creo que el OP se dio cuenta de que compila (pero no lo tenía claro) – newacct

+0

Sí, lo sé, debería aclararlo en mi pregunta. –

6

No, sin un modificador de acceso, la enumeración es paquete-privada. Esto significa que solo puede ser utilizado por las clases en el mismo paquete. Y no solo se puede hacer esto con una enumeración, las clases también se pueden hacer en paquete privado.

Más información: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

+1

Ignorando el brazo largo de Reflection. – kenny

+0

@Kenny, ¡muy cierto! ;) –

1

A veces este lenguaje puede ser sensible - por ejemplo, imagina que tienes una clase UploadHandler (o algo así) que puede devolver un estado de un proceso de carga. Me parece bastante factible implementar este estado como una enumeración, y dado que la enumeración (por ejemplo, UploadStatus) claramente "pertenece" a la clase UploadHandler, parece correcto declararla en el mismo archivo fuente. (Esto supone, por supuesto, que solo necesita ser un paquete privado; si es realmente público, debería declararse en su propio archivo, lo que probablemente tendría sentido si ya no es algo interno).

Sucede que, en este caso, probablemente lo convertiría en una clase interna estática para hacer la relación más explícita. Pero declarar varias clases en el mismo archivo de origen no siempre es malo y, en ocasiones, puede ayudar a la legibilidad configurando la expectativa de que se trata de una clase subsidiaria trivial y limítrofe.(Por la misma razón, no creo que clases como esta deban hacer nada particularmente complejo o inesperado.)

0

Una enumeración especifica una lista de valores constantes que se pueden asignar a un tipo particular. Puede ser dentro o fuera de la clase.

Cuestiones relacionadas