javaclassoopenumsaccess-modifiers

Is this proper enum practice in Java?


I just started learning enums in Java and although the concept seems straightforward, its application isn't really intuitive to me. I see that I can put enums inside of classes although they are classes themselves.

I also saw online some people say you can only have one enum in a class, or that you shouldn't put all enums in a single class unless they are put private.

Thus, I'm a bit confused, would this piece of code be a proper writing of enum?

Thanks.

public class AirCraft 
{
    private AirType type;
    private AirFixTime maintainTime;
    
    private enum AirType
    {
        HELICOPTER,
        AIRLINE,
        BALLOON,
        GLIDER;
    }
    
    private enum AirFixTime
    {
        WEEKLY,
        MONTHLY,
        YEARLY;
    }
}

Solution

  • You have a choice of three places to put an enum definition.

    Context is key

    You can place your enum definition anywhere that makes sense to you. It all depends on context.

    For example, consider the Month and DayOfWeek enum classes built into Java as part of the java.time classes. These enum definitions live in their own separate classes because they may be used in many different contexts, without the involvement of other java.time classes. These enums could be used on their own in workflow apps, sales reports, accounting apps, and more.

    In contrast, imagine a UI framework tracking mouse events. There we might find a Event enum for mouse events, defining objects named HOVER, CLICKED, and DRAGGED. This enum would best be housed within the Mouse class as it only has meaning within the context of the outer mouse-handling class.

    Another example, colors.

    Usages:

    myWebPage.setBackground( CssColor.DARK_SLATE_GREY ) ;  // This enum could be used on its own with many classes in different frameworks. So define enum in a separate class..
    
    myAircraft.getEmergencyStopButton().setColor( AirCraft.Color.SAFETY_ORANGE ) ;  // This enum is only ever used in contexts using its parent class, so nest the enum definition. 
    

    If nesting, think about your naming. I would likely name the enum Color rather than AircraftColor, because the nested notation AirCraft.Color.x makes clear the context. On the other hand, some folks like to use a static import to be able to use Color.x without the AirCraft. prefix (not my preference).

    Local enums

    New in Java 16 will be local enums (previewed in Java 15). That means enums defined within a method.

    This new feature seems to be documented only as a mention within the new Records feature: JEP 384: Records (Second Preview).

    private void demoLocalEnum ( )
    {
        enum Color { PURPLE , SAFETY_ORANGE }
        System.out.println( Color.PURPLE ) ;
    }
    

    As we can see in this screenshot, the enum only exists within the method containing its declaration. A sibling method on the same class does not know of the enum’s existence. In this example, trying to use the enum within another method generates an error within the IDE’s code editor.

    Screenshot of error "Cannot resolve symbol 'Color'" caused by trying to use in an enum defined locally in another method.

    Use this where your enum makes sense only within one chunk of code. If your enum is only used within a single method, then declaring it as a nested class draws undue attention. Being tucked away inside that method is more tidy.