这个Java枚举使用/设计正确吗?



我的任务是将一些Java代码转换为c#,并遇到以下枚举(我必须泛化它,因为代码是专有的,抱歉)。该代码的一般用途是从"非基本单位"转换为"基本单位"(例如从公里转换为毫米或其他单位)。他们有大量的转换)。我唯一改变的是变量名。该模式与代码中的模式完全相同…

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);
}

我有几个问题:

  • 在Java中使用枚举是一个好的实践吗?
  • 如果是或否,我应该在c#中采取什么方法?你能做类似的事情吗?即使我可以,我也不确定这种方法是否正确。

我不是要求别人为我转换这个…这是否是一个好方法,如果是的话,我是否应该尝试在c#中做同样的事情。如果不是,那么应该采取什么方法?

在Java中使用枚举是一个好的实践吗?

绝对。这正是在Java中引入枚举时所设想的用法。

我在c#中应该采取什么方法?

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

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>可以让您使用具有多个不同逻辑块的单个类,同时保留基于实例的调度。

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

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
    }
}

相关内容

  • 没有找到相关文章

最新更新