13

What is the best practice for packaging Java enums?

is it separate file for each enum?
or
having same file for all the enums?

What are the pros and cons ?

gnat
  • 21,442
  • 29
  • 112
  • 288
goodspeed
  • 167
  • 1
  • 2
  • 7

2 Answers2

12

First, an overriding rule is that if an enum is public, it must be declared in a file of its own. This is a Java rule that applies to all classes, interfaces, and enums, which cannot be broken.

For non-public enums, you should follow the same rule, except when multiple enums are closely connected.

For example, if you are building an expression processor and declaring an enumeration for an expression sub-type, a binary expression sub-type, and a unary expression sub-type, you may want to group the three enumerations together in a single file.

Sergey Kalinichenko
  • 17,393
  • 4
  • 57
  • 73
  • Great explanation. Is there any performance impact? if we have closely connected enums in same class as compared to having each for each enum. – goodspeed Sep 14 '12 at 16:00
  • 1
    @goodspeed Placement of classes/enums/interfaces in files has no performance impact (except possibly a tiny impact on compilation speed that you would not notice anyway). – Sergey Kalinichenko Sep 14 '12 at 16:09
  • @dasblinkenlight Do you have documentation for proving your second sentence, saying public enums should be placed in it's own file? – Max Sep 08 '14 at 17:19
  • 1
    @Max The rules for `enum`s are not different from rules for other classes: if a class is public, it needs to be in the file at a proper location matching the package name, with the class name matching the file name. – Sergey Kalinichenko Sep 08 '14 at 18:04
  • @dasblinkenlight Ah, thanks for your information and time. – Max Sep 08 '14 at 20:00
6

Enums are classes so you should pack them as ordinary classes. If the enum is used in many places inside the package then put it in a single file. If the enum is strongly linked with a class, then put it as a public (or protected) static inner class.

I do not see reasons for placing all the enums in a single file unless they are related.

Random42
  • 10,370
  • 10
  • 48
  • 65
  • If they are related, you can nest them in one class. public class Pse164884 { public enum Cat { siamese, manx} public enum Dog { bullgog, poodle } } – Ray Tayek Apr 13 '13 at 23:49