首页  >  文章  >  Java  >  C# 与 Java 枚举:哪一个提供更多功能?

C# 与 Java 枚举:哪一个提供更多功能?

Barbara Streisand
Barbara Streisand原创
2024-11-01 15:25:30719浏览

 C# vs Java Enums: Which One Offers More Functionality?

C# 与 Java 枚举:比较

Java 枚举提供了一种强大的方法来定义具有附加功能的常量,例如构造函数、方法和实例变量。虽然 C# 枚举乍一看似乎更简单,但与 Java 的稳健实现相比,它们有缺点。

主要差异

Feature Java C#
Constructors Supported Not supported
Methods Supported Requires extension methods
Instance variables Supported Requires custom attributes or dictionaries
Values Immutable Mutable

克服差异

扩展方法: 为了添加类似于 Java 枚举的功能,C# 允许在枚举上定义扩展方法。例如,以下代码提供了计算表面重力和表面重量的方法:

<code class="csharp">public static class Planets
{
    public static double GetSurfaceGravity(this Planet p) { /* ... */ }
    public static double GetSurfaceWeight(this Planet p, double otherMass) { /* ... */ }
}</code>

自定义属性:自定义属性可用于存储有关枚举的附加信息。以下是示例实现:

<code class="csharp">[PlanetAttr(3.303e+23, 2.4397e6)]
public enum Planet
{
    MERCURY,
    VENUS,
    EARTH,
    // ...
}

public class PlanetAttr : Attribute
{
    public double Mass { get; private set; }
    public double Radius { get; private set; }

    public PlanetAttr(double mass, double radius)
    {
        Mass = mass;
        Radius = radius;
    }
}</code>

通过访问枚举值的自定义属性,您可以检索关联的属性。

行星枚举示例

这里是C# 相当于使用扩展方法和自定义属性的 Sun 的 Planet 枚举:

<code class="csharp">public enum Planet
{
    [PlanetAttr(3.303e+23, 2.4397e6)] MERCURY,
    [PlanetAttr(4.869e+24, 6.0518e6)] VENUS,
    [PlanetAttr(5.976e+24, 6.37814e6)] EARTH,
    // ...
}

public static class Planets
{
    public const double G = 6.67300E-11;

    public static double GetSurfaceGravity(this Planet p)
    {
        PlanetAttr attr = GetAttr(p);
        return G * attr.Mass / (attr.Radius * attr.Radius);
    }

    public static double GetSurfaceWeight(this Planet p, double otherMass)
    {
        return otherMass * p.GetSurfaceGravity();
    }

    private static PlanetAttr GetAttr(Planet p)
    {
        FieldInfo field = typeof(Planet).GetField(Enum.GetName(typeof(Planet), p));
        return field.GetCustomAttribute<PlanetAttr>();
    }
}</code>

此代码定义具有质量和半径自定义属性的 Planet 枚举。 Planets 类提供了计算表面重力和重量的扩展方法,可以通过枚举本身访问这些方法。

以上是C# 与 Java 枚举:哪一个提供更多功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn