Interfaces vs. enums

前端 未结 5 1457
名媛妹妹
名媛妹妹 2021-02-07 00:24

Between interfaces and enums, which is better for declaring constants? Why is it so?

5条回答
  •  梦如初夏
    2021-02-07 01:02

    If there is a reason for your constants to have a specific type, if they need some kind of behavior (i.e., methods), or if they are composites of other values, enums are the way to go.

    For example, let's assume you're implementing a card game and you want to represent values and suits:

    enum Rank { 
        ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, 
        EIGHT, NINE, TEN, JACK, QUEEN, KING; 
    }
    enum Suit { SPADES, CLUBS, DIAMONDS, HEARTS } 
    

    There, it's now impossible to create cards with bogus suits or ranks.

    Sometimes, though, you are just interested in having a bunch of frequently used values declared somewhere. In that case, putting them in an enum would just be unnecessary effort, since these constants are just a tool to save us from remembering all the decimals of, say, π when we are calculating the circumference of a circle, or something. Which looks better?

    // Using enum:
    enum MathConstant { 
        PI(3.14159265358979323846), E(2.7182818284590452354);
        private final double value;
        MathConstant(double v) { value = v; }
        public double value() { return value; } 
    }
    // Usage:
    double circumference = MathConstant.PI.value() * diameter;
    
    // Using a constant class:
    final class MathConstants { 
        private MathConstants() { throw new UnsupportedOperationException(); }
        public static final double PI = 3.14159265358979323846,
                                   E = 2.7182818284590452354;
    }
    // Usage:
    double circumference = MathConstants.PI * diameter;
    

    As for interfaces: Never put constants in an interface. The "constant interface" pattern is bad (justification), and the only argument to use it has been rendered invalid since import static was added to Java.

提交回复
热议问题