ホームページ > Java > &#&チュートリアル > C# と Java Enum: どちらがより多くの機能を提供しますか?

C# と Java Enum: どちらがより多くの機能を提供しますか?

Barbara Streisand
リリース: 2024-11-01 15:25:30
オリジナル
821 人が閲覧しました

 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>
ログイン後にコピー

列挙値のカスタム属性にアクセスすると、関連付けられたプロパティを取得できます。

Planet Enum Example

これは拡張メソッドとカスタム属性を使用した Sun の Planet 列挙型と同等の C#:

<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>
ログイン後にコピー

このコードは、質量と半径のカスタム属性を持つ惑星の列挙型。 Planets クラスは、表面の重力と重量を計算するための拡張メソッドを提供します。これらのメソッドには、列挙型自体を通じてアクセスできます。

以上がC# と Java Enum: どちらがより多くの機能を提供しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート