2009-10-01 11 views
12

Je suis allé à cette interview pour un poste de développeur de logiciels et ils m'ont donné un test avec des situations de coin-cas, avec généralement 4 options à choisir.
Une des questions avait une énumération déclarée en dehors de la portée de la classe, j'ai rapidement vérifié la réponse «ne compile pas» et suis allé de l'avant avec les autres questions. Il était quelque chose comme:Enum déclaré en dehors de la portée de la classe

enum Colors {BLUE,RED,GREEN} 

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

Ce code compile en fait.
Outre le fait qu'une interview comme celle-ci (pourrait ou pourrait ne pas être utile pour savoir si l'on est un bon développeur, ce qui m'inquiète est: pourquoi devrais-je déclarer une énumération comme celle-ci? Pourquoi je ne peux le faire qu'avec enum? J'ai fait quelques tests et j'ai découvert qu'il est visible dans la classe, mais pas dans les autres classes.

Sidenote: J'ai marqué très mauvais: P. J'ai obtenu le maximum sur la théorie mais près de la plus basse possibile sur les situations de coin-cas-code. Je ne pense pas que je vais avoir le travail.

+3

Il sera visible aux autres classes dans le même espace de noms, et pas seulement dans un fichier. La plupart des enums dans BCL sont déclarés en dehors d'une classe, tout comme l'exemple que vous avez fourni (sauf qu'ils sont publics). Donc la question est de savoir pourquoi * ne déclareriez-vous pas une énumération comme celle-ci? – Groo

+0

Il est utile de vérifier si quelqu'un a travaillé avec le contrôle d'accès java et que les classes ne sont pas 100% de la forme public class A {private String field; méthode publique() {}} par défaut. –

+0

@Groo: Oui, il est –

Répondre

10

Ce n'est pas seulement enums. Les énumérations ne sont que des types particuliers de classes. En général, vous pouvez déclarer plusieurs classes dans un fichier (tant que deux d'entre elles ne sont pas publiques).

+0

Et le nom du fichier de classe peut être choisi librement (par exemple MyClass.java pour l'exemple). –

+0

J'ai complètement raté le passage "Les Enums sont juste des sortes spéciales de cours", dans cet esprit cela commence à avoir du sens. –

+0

En fait, cela fonctionne pour les classes (pas seulement enums). –

0

Il compile en fait, sur mon Eclipse! ;-)

Plusieurs classes peuvent être dans le même fichier. La limite est qu'une classe publique doit être définie dans un fichier portant le même nom.

Sa visibilité est 'paquet', donc il devrait aussi être visible dans les autres classes du même paquet.

Que puis-je faire avec cette énumération?

Vous pouvez faire tout ce que vous voulez avec les limites ci-dessus ...

Note: bien que vous avez eu tort, vous ne devriez pas se sentir trop mal, car il est pas vraiment une bonne pratique non plus. Dans notre configuration CheckStyle, les classes externes du même fichier sont traitées comme des erreurs !!

+1

bien sûr, il compile. Je pense que le PO a réalisé qu'il compile (mais n'était pas clair à ce sujet) – newacct

+0

Oui, je sais, je devrais le clarifier dans ma question. –

6

Non, sans un modificateur d'accès, l'enum est paquet-privé. Cela signifie qu'il ne peut être utilisé que par des classes dans le même paquet. Et vous ne pouvez pas seulement le faire avec une énumération, les classes peuvent aussi être faites en paquet privé.

Plus d'info: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

+1

Ignorer le bras long de la réflexion. – kenny

+0

@Kenny, très vrai! ;) –

1

Parfois, cet idiome peut être sensible - par exemple, imaginez que vous avez une classe UploadHandler (ou quelque chose comme ça) qui peut retourner un état à partir d'un téléchargement. Il me semble tout à fait faisable d'implémenter ce statut comme une énumération - et comme l'énumération (par exemple UploadStatus) appartient clairement à la classe UploadHandler, il semble correct de le déclarer dans le même fichier source. (Cela suppose bien sûr qu'il ne doit être que privé-paquet - s'il est vraiment public, il devrait être déclaré dans son propre fichier, ce qui aurait probablement du sens si ce n'était plus interne). En fait, dans ce cas, je ferais probablement une classe interne statique pour rendre la relation plus explicite. Mais déclarer plusieurs classes dans le même fichier source n'est pas toujours mauvais et peut parfois aider à la lisibilité en établissant l'attente qu'il s'agit d'une classe subsidiaire marginale-triviale.(De même, je ne pense pas que des classes comme celle-ci devraient faire quelque chose de particulièrement complexe ou inattendu.)

0

Une énumération spécifie une liste de valeurs constantes pouvant être affectées à un type particulier. Il peut être à l'intérieur ou à l'extérieur de la classe.

Questions connexes