这个 Java 枚举 Used/Designed 正确吗?

Is this Java Enumeration Used/Designed Correctly?

我的任务是将一些 Java 代码转换为 C# 并遇到以下枚举(我不得不概括它,因为代码是专有的,抱歉)。代码的一般目的是从 "non-base unit" 转换为 "base unit"(比如从公里转换为毫米,或其他任何东西。它们有大量的转换)。我唯一改变的是变量名。代码中的模式就是这样...

public enum ThisIsAnEnum implements someInterface
{        
    typeKilom( MetricType.kilometer ),

    typeMillm( MetricType.millimeter );

    public double convertSomething(double dbl1, double dbl2)
    {
        // do stuff
        return a double
    }
}

然后在代码中这样调用:

public static void main( String[] args )
{
    ThisIsAnEnum.typeKilom.convertSomething(aDouble, bDouble);
}

我有几个问题:

我不是要别人帮我转换这个...只是这是否是一个好方法,(如果是的话)我是否应该尝试在 C# 中做同样的事情。如果不是,那么应该采取什么方法?

java 枚举的使用是一个主观问题,我没有资格回答。我可以说您可以使用扩展方法在 C# 中解决您的问题。我不确定该界面有什么相关性,但鉴于您所展示的内容,您可以像这样重现它。

void Main() {
    ThisIsAnEnum.typeKilom.ConvertSomething(1, 2);
}

public enum ThisIsAnEnum {
    typeKilom,
    typeMillm,
}

public static class ThisIsAnEnumExtensions {
    // extension method
    public static double ConvertSomething(this ThisIsAnEnum @this, double dbl1, double dbl2) {
        return dbl1 + dbl2; // do stuff
    }
}

Is this use of enumerations a good practice in Java?

当然可以。这正是在 Java.

中引入枚举时所设想的那种用法

what approach should I take in C#?

由于 C# enum 不具备相同的功能,您需要以其他方式对其进行建模。一种方法是使用 Java enum 中的方法定义 class 或接口,并制作一堆 public readonly 实例来模仿 enum 条目:

public ISomeInterface {
    Func<double,double,double> ConvertSomething {get;}
}

public class ThisIsAnEnum : ISomeInterface {

    public Func<double,double,double> ConvertSomething {get;private set;}

    public MetricType MetricType {get;private set;}

    // Private constructor prevents outside instantiations
    private ThisIsAnEnum(MetricType mt) {
        MetricType = mt;
    }

    public static readonly ThisIsAnEnum TypeKilom = new ThisIsAnEnum(MetricType.Kilometer) {
        ConvertSomething = (dbl1, dbl2) => {
            ...
            return res;
        }
    }

    public static readonly ThisIsAnEnum TypeMillim = new ThisIsAnEnum(MetricType.Millimeter) {
        ConvertSomething = (dbl1, dbl2) => {
            ...
            return res;
        }
    }

}

使用 Func<double,double,double> 可让您将单个 class 用于多个不同的逻辑部分,同时保留基于实例的调度。

采用这种方法的一个不幸后果是您将无法 switch 在这些 enum 上。