Java 在枚举的静态方法中引用枚举本身的值

Java 在枚举的静态方法中引用枚举本身的值,java,enums,static-methods,Java,Enums,Static Methods,我有一个带有静态方法的Java枚举,我想在方法中引用枚举的值: public enum SpeedUnits { knots { @Override public String getAbbreviation(){ return "kts"; } }, feetpersecond { @Override public String getAbbreviation(){ return "fps"; } }; public abstract String getAbbrev

我有一个带有静态方法的Java枚举,我想在方法中引用枚举的值:

public enum SpeedUnits {
    knots { @Override public String getAbbreviation(){ return "kts"; } },
    feetpersecond { @Override public String getAbbreviation(){ return "fps"; } };

    public abstract String getAbbreviation();
    public static SpeedUnits forAbbreviation( String sAbbreviation ){
        if( sAbbreviation == null ) return null;
        if( sAbbreviation.equalsIgnoreCase( "kts" ) ) return knots;
        if( sAbbreviation.equalsIgnoreCase( "fps" ) ) return feetpersecond;
        return null;
    }
    public static int convertToIntegerKnots( int value ){
        if( *** speed-type-goes-here *** == knots) return value;
        if( *** speed-type-goes-here *** == feetpersecond ) return (int)( value * 0.592483801295896 );
    }
}
例如,我想调用convert,如下所示:

SpeedUnits eMySpeedUnit = SpeedUnits.feetpersecond;
int knots = eMySpeedUnit.convertToIntegerKnots( 80 );

如何在静态方法中引用枚举变量的当前值(请参见上面代码中的***位置)?

静态方法中没有枚举的当前值。将其设置为非静态后,可以使用
this
引用当前值。

静态方法中没有枚举的当前值。将其设置为非静态后,可以使用
this
引用当前值。

在您的示例中,在SpeedUnits的
实例上调用convertToIntegerKnots方法。方法的行为取决于这个实例。因此,该方法不应该是静态的,您可以使用
this
引用调用该方法的实例:

public int convertToIntegerKnots( int value ){
    if( this == knots) return value;
    if( this == feetpersecond ) return (int)( value * 0.592483801295896 );
}

但是,将该方法定义为抽象方法,并在每个枚举实例中重写它,这将更加简洁,就像您使用
get缩写()
方法一样。

在您的示例中,您在SpeedUnits的
实例上调用convertToIntegerKnots方法。方法的行为取决于这个实例。因此,该方法不应该是静态的,您可以使用
this
引用调用该方法的实例:

public int convertToIntegerKnots( int value ){
    if( this == knots) return value;
    if( this == feetpersecond ) return (int)( value * 0.592483801295896 );
}

但是,将该方法定义为抽象方法并在每个枚举实例中重写它会更简洁,就像您使用
get缩写()
方法一样。

看看JDK中的TimeUnit类,从中得到启发,它有更好的性能design@kan我对创建一个通用的“convert”方法很谨慎,因为如果我说,10个不同的速度单位,然后每个枚举将有一个到其他9个单位的转换器,总共90个方法。而且,有时值是双倍的,有时是整数,所以我可能实际上有180!!!!如果我这样做的话。通常,我的软件使用一到两个标准单位,所以我只需要转换成标准单位(比如整数节),而不是所有可能的单位。看看JDK中的TimeUnit类,它有更好的设计灵感design@kan我对创建一个通用的“转换”方法很谨慎,因为如果我有10个不同的速度单位,然后每个枚举将有一个到其他9个单元的转换器,总共90个方法。而且,有时值是双倍的,有时是整数,所以我可能实际上有180!!!!如果我这样做的话。通常,我的软件使用一到两个标准单位,所以我只需要转换成标准单位(比如整数节),而不是所有可能的单位。