这个 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);
}
我有几个问题:
- 枚举的这种使用在 Java 中是一种好的做法吗?
- 如果是或否,我应该在 C# 中采用什么方法?你能做类似的事情吗?即使可以,我也不确定这种方法是否正确。
我不是要别人帮我转换这个...只是这是否是一个好方法,(如果是的话)我是否应该尝试在 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
上。
我的任务是将一些 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);
}
我有几个问题:
- 枚举的这种使用在 Java 中是一种好的做法吗?
- 如果是或否,我应该在 C# 中采用什么方法?你能做类似的事情吗?即使可以,我也不确定这种方法是否正确。
我不是要别人帮我转换这个...只是这是否是一个好方法,(如果是的话)我是否应该尝试在 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
上。