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

时间:2015-06-09 15:09:55

标签: java c# design-patterns enums

我的任务是将一些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#中做同样的事情。如果不是,那么应该采取什么方法?

2 个答案:

答案 0 :(得分:2)

  

枚举的使用在Java中是一种很好的做法吗?

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

  

我应该采用什么方法进行C#?

由于C#enum没有相同的功能,您需要以其他方式对其进行建模。一种方法是使用Java enum中的方法定义类或接口,并创建一组模仿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>可以使用具有多个不同逻辑的单个类,同时根据实例保留调度。

采用这种方法的一个不幸后果是,您无法在这些switchenum

答案 1 :(得分:1)

使用java enums是一个主观问题,我不太有资格回答。我可以说你可以使用扩展方法在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
    }
}