সি # বনাম জাভা এনুম (তাদের জন্য সি # তে নতুন)


182

আমি জাভাতে কিছুক্ষণ প্রোগ্রামিং করছি এবং পুরোপুরি সি # তে লেখা একটি প্রকল্পের দিকে ছুঁড়েছি। আমি সি # তে গতিতে এগিয়ে আসার চেষ্টা করছি, এবং আমার নতুন প্রকল্পে বেশ কয়েকটি জায়গায় ব্যবহৃত এনামগুলি লক্ষ্য করেছি, তবে প্রথম নজরে, সি # এর এনামগুলি জাভা 1.5+ বাস্তবায়নের চেয়ে আরও সরল মনে হয়েছে। সি # এবং জাভা এনামগুলির মধ্যে যে কেউ পার্থক্য গণনা করতে পারে এবং কীভাবে এই পার্থক্যগুলি কাটিয়ে উঠতে পারে? (আমি কোনও ভাষা শিখা যুদ্ধ শুরু করতে চাই না, আমি জাভাতে যা করতাম সি # তে কিছু জিনিস কীভাবে করব তা আমি জানতে চাই)) উদাহরণস্বরূপ, কেউ সূর্যের বিখ্যাত প্ল্যানেট এনাম উদাহরণের সাথে সি # সমমনা পোস্ট করতে পারে?

public enum Planet {
  MERCURY (3.303e+23, 2.4397e6),
  VENUS   (4.869e+24, 6.0518e6),
  EARTH   (5.976e+24, 6.37814e6),
  MARS    (6.421e+23, 3.3972e6),
  JUPITER (1.9e+27,   7.1492e7),
  SATURN  (5.688e+26, 6.0268e7),
  URANUS  (8.686e+25, 2.5559e7),
  NEPTUNE (1.024e+26, 2.4746e7),
  PLUTO   (1.27e+22,  1.137e6);

  private final double mass;   // in kilograms
  private final double radius; // in meters
  Planet(double mass, double radius) {
      this.mass = mass;
      this.radius = radius;
  }
  public double mass()   { return mass; }
  public double radius() { return radius; }

  // universal gravitational constant  (m3 kg-1 s-2)
  public static final double G = 6.67300E-11;

  public double surfaceGravity() {
      return G * mass / (radius * radius);
  }
  public double surfaceWeight(double otherMass) {
      return otherMass * surfaceGravity();
  }
}

// Example usage (slight modification of Sun's example):
public static void main(String[] args) {
    Planet pEarth = Planet.EARTH;
    double earthRadius = pEarth.radius(); // Just threw it in to show usage

    // Argument passed in is earth Weight.  Calculate weight on each planet:
    double earthWeight = Double.parseDouble(args[0]);
    double mass = earthWeight/pEarth.surfaceGravity();
    for (Planet p : Planet.values())
       System.out.printf("Your weight on %s is %f%n",
                         p, p.surfaceWeight(mass));
}

// Example output:
$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
[etc ...]

1
@comp- এর জন্য আমি কৃতিত্ব নিতে পারি না। এটি সূর্যের (এখন ওরাকল) থেকে এসেছে: docs.oracle.com/javase/tutorial/java/javaOO/enum.html
ওগ্রে গীতসংহিতা 33

উত্তর:


210

সিএলআর-এ গণনাগুলি কেবল নামকরণের ধ্রুবক হিসাবে চিহ্নিত করা হয়। অন্তর্নিহিত প্রকারটি অবশ্যই অবিচ্ছেদ্য হতে হবে। জাভাতে একটি গণনা একটি প্রকারের নামকৃত উদাহরণের মতো। এই ধরনেরটি বেশ জটিল হতে পারে এবং - যেমন আপনার উদাহরণ হিসাবে দেখায় - বিভিন্ন ধরণের একাধিক ক্ষেত্র থাকে।

উদাহরণটিকে সি # তে পোর্ট করার জন্য আমি কেবল এনামকে একটি অপরিবর্তনীয় শ্রেণিতে পরিবর্তন করব এবং সেই শ্রেণীর স্থির পাঠযোগ্যভাবে উদাহরণগুলি প্রকাশ করব:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Planet planetEarth = Planet.MERCURY;

            double earthRadius = pEarth.Radius; // Just threw it in to show usage
            double earthWeight = double.Parse("123");
            double earthMass   = earthWeight / pEarth.SurfaceGravity();

            foreach (Planet p in Planet.Values)
                Console.WriteLine($"Your weight on {p} is {p.SurfaceWeight(mass)}");

            Console.ReadKey();
        }
    }

    public class Planet
    {
        public static readonly Planet MERCURY = new Planet("Mercury", 3.303e+23, 2.4397e6);
        public static readonly Planet VENUS   = new Planet("Venus", 4.869e+24, 6.0518e6);
        public static readonly Planet EARTH   = new Planet("Earth", 5.976e+24, 6.37814e6);
        public static readonly Planet MARS    = new Planet("Mars", 6.421e+23, 3.3972e6);
        public static readonly Planet JUPITER = new Planet("Jupiter", 1.9e+27, 7.1492e7);
        public static readonly Planet SATURN  = new Planet("Saturn", 5.688e+26, 6.0268e7);
        public static readonly Planet URANUS  = new Planet("Uranus", 8.686e+25, 2.5559e7);
        public static readonly Planet NEPTUNE = new Planet("Neptune", 1.024e+26, 2.4746e7);
        public static readonly Planet PLUTO   = new Planet("Pluto", 1.27e+22, 1.137e6);

        public static IEnumerable<Planet> Values
        {
            get
            {
                yield return MERCURY;
                yield return VENUS;
                yield return EARTH;
                yield return MARS;
                yield return JUPITER;
                yield return SATURN;
                yield return URANUS;
                yield return NEPTUNE;
                yield return PLUTO;
            }
        }

        public string Name   { get; private set; }
        public double Mass   { get; private set; }
        public double Radius { get; private set; }

        Planet(string name, double mass, double radius) => 
            (Name, Mass, Radius) = (name, mass, radius);

        // Wniversal gravitational constant  (m3 kg-1 s-2)
        public const double G = 6.67300E-11;
        public double SurfaceGravity()            => G * mass / (radius * radius);
        public double SurfaceWeight(double other) => other * SurfaceGravity();
        public override string ToString()         => name;
    }
}

4
এটি এই ধরণের সুরক্ষিত এনাম যে আমাদের দরিদ্র লোকেরা জাভা ১.৪ ব্যবহার করতে বাধ্য করেছে এবং নীচে প্রয়োগ করতে হবে ... জাভা 5 এর এনামগুলি সম্ভবত জাভা 5+ এর সেরা বৈশিষ্ট্য, বিশেষত যেহেতু তারা স্যুইচ স্টেটমেন্টগুলিতে ব্যবহার করা যেতে পারে।
MetroidFan2002

9
@ ক্রিস: শুধুমাত্র পতাকা এনামগুলিকে বহুবচন করা উচিত। অর্থাৎ, গণনাগুলি যার সদস্যগণ | ব্যবহার করে একত্রিত হন অপারেটর.
কেন্ট বুগার্ট

5
@ ম্লেডেন: এটি পুরোপুরি প্রসঙ্গে নির্ভর করে। গ্রহের একটি গণনা সীমিত সংখ্যক গ্রহে অ্যাক্সেস সরবরাহ করে এমন একটি খেলায় পুরোপুরি উপযুক্ত হতে পারে। কোডে পরিবর্তনগুলি গেমটিতে কোনও নতুন গ্রহ যুক্ত করা থাকলে আপনি কী চান তা অবিকল হতে পারে।
কেন্ট বুগার্ট

3
@ রিচি_ডাব্লু আপনি মানগুলি সম্পত্তি ব্যবহার করে এনামগুলিতে পুনরাবৃত্তি করতে পারেন।
জোনাথন

23
বাহ ... জাভা
সুন রাসমুসেন

218

সি # তে আপনি এনামগুলিতে এক্সটেনশন পদ্ধতিগুলি সংজ্ঞায়িত করতে পারেন এবং এটি কিছু অনুপস্থিত কার্যকারিতা তৈরি করে।

আপনি সংজ্ঞায়িত করতে Planetএকটি enum যেমন এবং এক্সটেনশন পদ্ধতি সমতুল্য আছে surfaceGravity()এবং surfaceWeight()

আমি মিখাইলের পরামর্শ অনুসারে কাস্টম বৈশিষ্ট্যগুলি ব্যবহার করেছি তবে অভিধান ব্যবহার করে এটি অর্জন করা যেতে পারে the

using System;
using System.Reflection;

class PlanetAttr: Attribute
{
    internal PlanetAttr(double mass, double radius)
    {
        this.Mass = mass;
        this.Radius = radius;
    }
    public double Mass { get; private set; }
    public double Radius { get; private set; }
}

public static class Planets
{
    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();
    }

    public const double G = 6.67300E-11;

    private static PlanetAttr GetAttr(Planet p)
    {
        return (PlanetAttr)Attribute.GetCustomAttribute(ForValue(p), typeof(PlanetAttr));
    }

    private static MemberInfo ForValue(Planet p)
    {
        return typeof(Planet).GetField(Enum.GetName(typeof(Planet), p));
    }

}

public enum Planet
{
    [PlanetAttr(3.303e+23, 2.4397e6)]  MERCURY,
    [PlanetAttr(4.869e+24, 6.0518e6)]  VENUS,
    [PlanetAttr(5.976e+24, 6.37814e6)] EARTH,
    [PlanetAttr(6.421e+23, 3.3972e6)]  MARS,
    [PlanetAttr(1.9e+27,   7.1492e7)]  JUPITER,
    [PlanetAttr(5.688e+26, 6.0268e7)]  SATURN,
    [PlanetAttr(8.686e+25, 2.5559e7)]  URANUS,
    [PlanetAttr(1.024e+26, 2.4746e7)]  NEPTUNE,
    [PlanetAttr(1.27e+22,  1.137e6)]   PLUTO
}

20
আমি মনে করি এটি আরও ভোট দেওয়া উচিত। জাভাতে এনামরা কীভাবে কাজ করে এটি এটির কাছাকাছি। আমি প্ল্যানেট.মারকিউরি.গেটসারফেসগ্রাভিটি () <এর মতো কিছু করতে পারি <- এনুমে এক্সটেনশন পদ্ধতিটি নোট করুন!
ততোনহ্যাকার

2
অবশ্যই হ্যাঁ. এনামগুলিতে এক্সটেনশন পদ্ধতিগুলি (হ্যাক, সাধারণভাবে এক্সটেনশন পদ্ধতিগুলি) সি # তে দুর্দান্ত সংযোজন।
কিথস

3
ধন্যবাদ অ্যালনগুরালেনেক ধন্যবাদ যদিও সবাই মেটাডেটা সম্পর্কে একমত হবে না। সম্পর্কিত কোডরেভিউ.স্ট্যাকেক্সচেঞ্জ প্রশ্নের বিষয়ে ম্যাটড্যাভির মন্তব্য দেখুন ।
ফিনউইউ

@ ফিনউ: আমি কোড রিভিউ এসই সাইটের কথা কখনও শুনিনি - এর জন্য ধন্যবাদ! আমি এই আলোচনাটি সেখানে চালিয়েছি (যদিও এটি প্রোগ্রামারগুলিতে এটির নিজের প্রশ্নের প্রাপ্য হতে পারে)।
অ্যালন গুরালেনেক

এটি একটি দুর্দান্ত সমাধান - কেউ এর পারফরম্যান্স পরীক্ষা করেছে? উদাহরণস্বরূপ, শ্রেণীর কোনও সম্পত্তিতে অ্যাক্সেসের তুলনায় গুণটি অ্যাক্সেস করতে কতক্ষণ সময় লাগে না।
সাইমন মেয়ার

35

সি তে # এনট্রিবিউটগুলি এনামগুলির সাথে ব্যবহার করা যেতে পারে। বিশদ বিবরণ সহ এই প্রোগ্রামিং প্যাটার্নের ভাল উদাহরণ এখানে রয়েছে (কোডপোজেক্ট)

public enum Planet
{
   [PlanetAttr(3.303e+23, 2.4397e6)]
   Mercury,
   [PlanetAttr(4.869e+24, 6.0518e6)]
   Venus
} 

সম্পাদনা: সম্প্রতি এই প্রশ্নটি আবার জিজ্ঞাসা করা হয়েছে এবং জন স্কিটি উত্তর দিয়েছেন: সি # তে জাভার এনামের সমতুল্য কী? সি # তে ব্যক্তিগত অভ্যন্তর শ্রেণি - কেন তারা বেশি ঘন ঘন ব্যবহার হয় না?

সম্পাদনা করুন 2: দেখুন গৃহীত উত্তর যা খুবই উজ্জ্বল ভাবে এই পদ্ধতির প্রসারিত!


1
নিস! এটি কেবল সামান্য আড়ম্বরপূর্ণ বোধ করে তবে অন্যথায় এনামগুলিতে অতিরিক্ত ডেটা যুক্ত করার জন্য এটি একটি খুব গ্রহণযোগ্য পদ্ধতি। আমি অকপটে আশ্চর্য হয়েছি যে এই দুর্দান্ত সমাধানটির উল্লেখ করতে কাউকে এতদিন সময় লেগেছে!
ওগ্রে গীতসংহিতা 33

13

জাভা এনামগুলি আসলে সম্পূর্ণ ক্লাস যেখানে একটি প্রাইভেট কনস্ট্রাক্টর এবং পদ্ধতি ইত্যাদি থাকতে পারে তবে সি # এনামগুলি কেবলমাত্র পূর্ণসংখ্যার নামকরণ করে। আইএমও জাভার বাস্তবায়ন অনেক উন্নত।

জাভা শিবির থেকে আগত সি # শেখার সময় এই পৃষ্ঠায় আপনাকে অনেক সহায়তা করা উচিত। (লিঙ্কগুলি এনামগুলি সম্পর্কে পার্থক্যের দিকে নির্দেশ করে (অন্যান্য জিনিসের জন্য উপরে / নীচে স্ক্রোল করুন)


1
আপনার লিঙ্কটি সি # এবং জাভার মধ্যে মিল এবং পার্থক্যগুলির একটি আকর্ষণীয়, বিস্তৃত ওভারভিউ দেয়, তবে পাঠ্যের অনেকগুলি ভুল রয়েছে (যেমন ভুলভাবে বলা হয়েছে যে জাভা সুরক্ষিত সি # অভ্যন্তরের সমান এবং এটি অভ্যন্তরীণ সুরক্ষিত হওয়া উচিত)। সুতরাং সেখানে সমস্ত কিছুই মঞ্জুর করুন না :)
মাফু

1
আমি জাভা এর অনুরাগী হওয়া সত্ত্বেও জাভা এনামগুলি উন্নততর বলব না। সি # সহজেই পূর্ণসংখ্যার ঘোষণাকে সমর্থন করে যেমন FOO = 0ওআরএম সরঞ্জামগুলিতে কোনটি ব্যবহার করা সহজ (কোনও ত্রুটির প্রবণতা ordinal()ব্যবহারের প্রয়োজন নেই)। আরও সি ​​# বিটওয়াসার গণনাগুলিকে সমর্থন করে যা প্রায়শই খুব উপযোগী হয়, বিশেষত এর সাথে মিলিয়ে EntityFramework। জাভাতে তাদের এনামগুলিকে প্রসারিত করা উচিত যাতে তারা পূর্ণসংখ্যার সাথেও আবদ্ধ হতে পারে। তারপরে তারা উন্নত হবে :)
djmj

4

এরকম কিছু আমার মনে হয়:

public class Planets 
{
    public static readonly Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
    public static readonly Planet VENUS = new Planet(4.869e+24, 6.0518e6);
    public static readonly Planet EARTH = new Planet(5.976e+24, 6.37814e6);
    public static readonly Planet MARS = new Planet(6.421e+23, 3.3972e6);
    public static readonly Planet JUPITER = new Planet(1.9e+27,   7.1492e7);
    public static readonly Planet SATURN = new Planet(5.688e+26, 6.0268e7);
    public static readonly Planet URANUS = new Planet(8.686e+25, 2.5559e7);
    public static readonly Planet NEPTUNE = new Planet(1.024e+26, 2.4746e7);
    public static readonly Planet PLUTO = new Planet(1.27e+22,  1.137e6);
}

public class Planet
{
    public double Mass {get;private set;}
    public double Radius {get;private set;}

    Planet(double mass, double radius)
    {
        Mass = mass;
        Radius = radius;
    }

    // universal gravitational constant  (m3 kg-1 s-2)
    private static readonly double G = 6.67300E-11;

    public double SurfaceGravity()
    {
        return G * Mass / (Radius * Radius);
    }

    public double SurfaceWeight(double otherMass)
    {
        return otherMass * SurfaceGravity();
    }
}

বা Planetউপরের মত ধ্রুবকগুলিকে ক্লাসে সংযুক্ত করুন


8
বেশ নয় - প্ল্যানেট কনস্ট্রাক্টর ব্যক্তিগত হতে হবে; এনামগুলির পয়েন্টের অংশটি হ'ল এগুলি মানগুলির একটি নির্দিষ্ট সেট। মানগুলি তখন প্ল্যানেট শ্রেণিতেও সংজ্ঞায়িত হত।
জন স্কিটি

এখনো না. 1) গণকটি অনুপস্থিত :) 2) এনামগুলিকে কখনই পরিবর্তনযোগ্য করা উচিত নয়। ওহ এবং সর্বশেষে, আপনার কোডটি একটি একক শ্রেণীর জন্য প্রার্থনা করে (যেমন আপনি যখন কোনও ব্যক্তিগত নির্মাণকারী
থাকবেন

3

এখানে আরও একটি আকর্ষণীয় ধারণা যা জাভাতে উপলব্ধ কাস্টম আচরণের জন্য কাজ করে। আমি নীচের Enumerationবেস ক্লাস নিয়ে এসেছি :

public abstract class Enumeration<T>
    where T : Enumeration<T>
{   
    protected static int nextOrdinal = 0;

    protected static readonly Dictionary<int, Enumeration<T>> byOrdinal = new Dictionary<int, Enumeration<T>>();
    protected static readonly Dictionary<string, Enumeration<T>> byName = new Dictionary<string, Enumeration<T>>();

    protected readonly string name;
    protected readonly int ordinal;

    protected Enumeration(string name)
        : this (name, nextOrdinal)
    {
    }

    protected Enumeration(string name, int ordinal)
    {
        this.name = name;
        this.ordinal = ordinal;
        nextOrdinal = ordinal + 1;
        byOrdinal.Add(ordinal, this);
        byName.Add(name, this);
    }

    public override string ToString()
    {
        return name;
    }

    public string Name 
    {
        get { return name; }
    }

    public static explicit operator int(Enumeration<T> obj)
    {
        return obj.ordinal;
    }

    public int Ordinal
    {
        get { return ordinal; }
    }
}

এটি মূলত ঠিক তেমনি একটি প্রকারের প্যারামিটার পেয়েছে যাতে অর্ডিনাল গণনাটি বিভিন্ন উত্পন্ন অঙ্কগুলি জুড়ে সঠিকভাবে কাজ করবে। Operatorউপরের অন্য প্রশ্নের (http://stackoverflow.com/questions/1376312/whats-the-equivalent-of-javas-enum-in-c) এর উত্তর থেকে জন্ স্কিটির উদাহরণটি তখন পরিণত হয়:

public class Operator : Enumeration<Operator>
{
    public static readonly Operator Plus = new Operator("Plus", (x, y) => x + y);
    public static readonly Operator Minus =  new Operator("Minus", (x, y) => x - y);
    public static readonly Operator Times =  new Operator("Times", (x, y) => x * y);
    public static readonly Operator Divide = new Operator("Divide", (x, y) => x / y);

    private readonly Func<int, int, int> op;

    // Prevent other top-level types from instantiating
    private Operator(string name, Func<int, int, int> op)
        :base (name)
    {
        this.op = op;
    }

    public int Execute(int left, int right)
    {
        return op(left, right);
    }
}

এটি কয়েকটি সুবিধা দেয়।

  • সাধারণ সমর্থন
  • রূপান্তর stringএবং এটি intযা স্যুইচ স্টেটমেন্টগুলিকে সম্ভাব্য করে তোলে
  • গেটটাইপ () উদ্ভূত গণনা টাইপের প্রতিটি মানের জন্য একই ফলাফল দেবে।
  • System.Enumএকই কার্যকারিতাটির অনুমতি দেওয়ার জন্য স্ট্যাটিক পদ্ধতিগুলি বেস এনুমুরেশন ক্লাসে যুক্ত করা যেতে পারে।

3

আমরা কেবলমাত্র # # https://github.com/simonmau/enum_ext এর জন্য এনাম এক্সটেনশন করেছি

এটি টাইপসফেনিয়ামের জন্য কেবল একটি বাস্তবায়ন, তবে এটি দুর্দান্ত কাজ করে তাই আমরা ভাগ করে নেওয়ার জন্য একটি প্যাকেজ তৈরি করেছি - এটির সাথে মজা করুন

public sealed class Weekday : TypeSafeNameEnum<Weekday, int>
{
    public static readonly Weekday Monday = new Weekday(1, "--Monday--");
    public static readonly Weekday Tuesday = new Weekday(2, "--Tuesday--");
    public static readonly Weekday Wednesday = new Weekday(3, "--Wednesday--");
    ....

    private Weekday(int id, string name) : base(id, name)
    {
    }
}

2

একটি জাভা এনাম একটি ওও পদ্ধতিতে গণনা উপস্থাপনের জন্য সিনট্যাকটিক চিনি। তারা জাভাতে এনাম শ্রেণি বিস্তৃত বিমূর্ত শ্রেণি, এবং প্রতিটি এনাম মান এনাম বর্গের একটি স্থির চূড়ান্ত পাবলিক উদাহরণ প্রয়োগের মতো। উত্পন্ন ক্লাসগুলি দেখুন, এবং 10 টি মান সহ একটি এনাম "ফু" জন্য, আপনি "ফু $ 10" উত্পন্ন উত্সের মাধ্যমে "ফু। 1" দেখতে পাবেন।

যদিও আমি সি # জানি না, তবে আমি কেবল অনুমান করতে পারি যে সেই ভাষায় একটি এনাম সি স্টাইলের ভাষাগুলিতে প্রচলিত এনামের মতো। আমি একটি দ্রুত গুগল অনুসন্ধান থেকে দেখছি যে তারা যদিও একাধিক মান ধরে রাখতে পারে, তাই সম্ভবত এগুলি সম্ভবত একইভাবে প্রয়োগ করা হয়েছে তবে জাভা সংকলক যা অনুমতি দেয় তার চেয়ে অনেক বেশি বিধিনিষেধের সাথে with


3
ভাল জাভা এবং সি # তে সমস্ত কিছুই জেভিএম বা সিএলআর বাইটকোডের সিনট্যাকটিক চিনির সম্পর্কে নয়? :) শুধু বলুন '
ততোনহ্যাকার

2

জাভা এনামগুলি সংকলক-উত্পাদিত মান, অর্থ পদ্ধতি ব্যবহার করে নাম থেকে সহজ প্রকারের রূপান্তর করতে দেয়

// Java Enum has generics smarts and allows this
Planet p = Planet.valueOf("MERCURY");

সি # তে কাঁচা এনামের সমতুল্য আরও ভার্বোজ:

// C# enum - bit of hoop jumping required
Planet p = (Planet)Enum.Parse(typeof(Planet), "MERCURY");

তবে আপনি যদি কেন্টের দ্বারা বঞ্চিত রুটটিতে যান তবে আপনি সহজেই ValueOfআপনার এনম ক্লাসে একটি পদ্ধতি প্রয়োগ করতে পারেন ।


জাভা উদাহরণটি সংকলক দ্বারা উত্পাদিত একটি সিন্থেটিক পদ্ধতি ব্যবহার করছে - জেনেরিকগুলির সাথে মোটেই কিছুই করার নেই। এনুমের একটি জেনেরিক মান আছে পদ্ধতি রয়েছে তবে এটি ক্লাসের জেনেরিকগুলি ব্যবহার করে এনুমের নয়।
টম হাটিন - এ 12

2

আমার সন্দেহ হয় যে সি # তে এনামগুলি কেবল সিএলআরের অভ্যন্তরীণ ধ্রুবক, তবে তাদের সাথে এটি পরিচিত নয়। আমি জাভাতে কিছু ক্লাস ছড়িয়ে ফেলেছি এবং আমি আপনাকে বলতে পারি এনামগুলি একবার আপনি রূপান্তরিত হয়ে উঠতে চান।

জাভা কিছু লুক্কায়িত করে। এটি এনাম শ্রেণীর সাথে এআর সাধারণ শ্রেণি হিসাবে বিবেচনা করে, যতটা কাছাকাছি আমি অঙ্ক করতে পারি, এনাম মানগুলি উল্লেখ করার সময় প্রচুর ম্যাক্রো ব্যবহার করে। আপনার যদি জাভা ক্লাসে এনামস ব্যবহার করে এমন কেস স্টেটমেন্ট থাকে তবে এটি এনাম রেফারেন্সটিকে পূর্ণসংখ্যার প্রতিস্থাপন করে। আপনার যদি স্ট্রিংয়ে যেতে হয়, এটি প্রতিটি ক্লাসে এটি ব্যবহার করে একটি অর্ডিনাল দ্বারা সূচিযুক্ত স্ট্রিংগুলির একটি অ্যারে তৈরি করে। বক্সিংয়ে বাঁচাতে আমার সন্দেহ হয়।

আপনি যদি এই ডিসকম্পিলারটি ডাউনলোড করেন তবে আপনি দেখতে পাবেন যে এটি কীভাবে এটির শ্রেণি তৈরি করে এটি এটি সংহত করে। বরং সৎ হতে আকর্ষণীয়। আমি এনাম ক্লাস ব্যবহার করতাম না কারণ আমি ভেবেছিলাম এটি কেবল ধ্রুবকগুলির জন্য স্ফীত হয়। আপনি এগুলিকে সি # তে ব্যবহার করতে পারেন এমন সীমিত উপায়ের চেয়ে ভাল।

http://mebers.fortunecity.com/neshkov/dj.html - জাভা ডিসম্পিলার


0

জাভাতে এনাম সি # এনামের চেয়ে অনেক জটিল এবং অতএব আরও শক্তিশালী। যেহেতু এটি অন্য একটি সংকলনের সময় সিনট্যাক্টিকাল চিনির সাথে ভাবছি আমি ভাবছি যে বাস্তব জীবনের অ্যাপ্লিকেশনগুলিতে এর সীমিত ব্যবহারের দ্বারা ভাষাটি অন্তর্ভুক্ত করা সত্যিই উপযুক্ত ছিল কিনা। একটি ছোটখাটো বৈশিষ্ট্য অন্তর্ভুক্ত করার চাপ ছেড়ে দেওয়ার চেয়ে কখনও কখনও ভাষার বাইরে জিনিস রাখা শক্ত হয়।


2
আমি শ্রদ্ধার সাথে একমত। জাভা 1.5 এনামগুলি একটি শক্তিশালী ভাষার বৈশিষ্ট্য যা আমি স্থির নামযুক্ত আইটেমগুলির স্বতন্ত্র সেটগুলির সাথে মোকাবিলা করে সমস্যার আরও বেশি ওও-কেন্দ্রিক সমাধান প্রয়োগ করতে বহুবার ব্যবহার করেছি।
ওগ্রে গীতসংহিতা 33

1
আপনি হতে পারে। তবে স্মার্ট 'স্যুইচ' ভাষা সংহতকরণের বাইরে, উপরের উদাহরণগুলি যেমন দেখায় তেমন বাকী কার্যকারিতা সহজেই সি # বা জাভাতে প্রতিলিপি করা যেতে পারে।
dmihailescu

@ ডিমিহাইলস্কু "তারপরে জাভাতে এনাম সি # এর চেয়ে অনেক জটিল So তাই আমি জাভা বাদ দিয়েছি ..."
মুকুস

0
//Review the sample enum below for a template on how to implement a JavaEnum.
//There is also an EnumSet implementation below.

public abstract class JavaEnum : IComparable {
    public static IEnumerable<JavaEnum> Values {
        get {
            throw new NotImplementedException("Enumeration missing");
        }
    }

    public readonly string Name;

    public JavaEnum(string name) {
        this.Name = name;
    }

    public override string ToString() {
        return base.ToString() + "." + Name.ToUpper();
    }

    public int CompareTo(object obj) {
        if(obj is JavaEnum) {
            return string.Compare(this.Name, ((JavaEnum)obj).Name);
        } else {
            throw new ArgumentException();
        }
    }


    //Dictionary values are of type SortedSet<T>
    private static Dictionary<Type, object> enumDictionary;
    public static SortedSet<T> RetrieveEnumValues<T>() where T : JavaEnum {
        if(enumDictionary == null) {
            enumDictionary = new Dictionary<Type, object>();
        }
        object enums;
        if(!enumDictionary.TryGetValue(typeof(T), out enums)) {
            enums = new SortedSet<T>();
            FieldInfo[] myFieldInfo = typeof(T).GetFields(BindingFlags.Static | BindingFlags.DeclaredOnly | BindingFlags.Public);
            foreach(FieldInfo f in myFieldInfo) {
                if(f.FieldType == typeof(T)) {
                    ((SortedSet<T>)enums).Add((T)f.GetValue(null));
                }
            }
            enumDictionary.Add(typeof(T), enums);
        }
        return (SortedSet<T>)enums;
    }
}


//Sample JavaEnum
public class SampleEnum : JavaEnum {
    //Enum values
    public static readonly SampleEnum A = new SampleEnum("A", 1);
    public static readonly SampleEnum B = new SampleEnum("B", 2);
    public static readonly SampleEnum C = new SampleEnum("C", 3);

    //Variables or Properties common to all enums of this type
    public int int1;
    public static int int2 = 4;
    public static readonly int int3 = 9;

    //The Values property must be replaced with a call to JavaEnum.generateEnumValues<MyEnumType>() to generate an IEnumerable set.
    public static new IEnumerable<SampleEnum> Values {
        get {
            foreach(var e in JavaEnum.RetrieveEnumValues<SampleEnum>()) {
                yield return e;
            }
            //If this enum should compose several enums, add them here
            //foreach(var e in ChildSampleEnum.Values) {
            //    yield return e;
            //}
        }
    }

    public SampleEnum(string name, int int1)
        : base(name) {
        this.int1 = int1;
    }
}


public class EnumSet<T> : SortedSet<T> where T : JavaEnum {
    // Creates an enum set containing all of the elements in the specified element type.
    public static EnumSet<T> AllOf(IEnumerable<T> values) {
        EnumSet<T> returnSet = new EnumSet<T>();
        foreach(T item in values) {
            returnSet.Add(item);
        }
        return returnSet;
    }

    // Creates an enum set with the same element type as the specified enum set, initially containing all the elements of this type that are not contained in the specified set.
    public static EnumSet<T> ComplementOf(IEnumerable<T> values, EnumSet<T> set) {
        EnumSet<T> returnSet = new EnumSet<T>();
        foreach(T item in values) {
            if(!set.Contains(item)) {
                returnSet.Add(item);
            }
        }
        return returnSet;
    }

    // Creates an enum set initially containing all of the elements in the range defined by the two specified endpoints.
    public static EnumSet<T> Range(IEnumerable<T> values, T from, T to) {
        EnumSet<T> returnSet = new EnumSet<T>();
        if(from == to) {
            returnSet.Add(from);
            return returnSet;
        }
        bool isFrom = false;
        foreach(T item in values) {
            if(isFrom) {
                returnSet.Add(item);
                if(item == to) {
                    return returnSet;
                }
            } else if(item == from) {
                isFrom = true;
                returnSet.Add(item);
            }
        }
        throw new ArgumentException();
    }

    // Creates an enum set initially containing the specified element(s).
    public static EnumSet<T> Of(params T[] setItems) {
        EnumSet<T> returnSet = new EnumSet<T>();
        foreach(T item in setItems) {
            returnSet.Add(item);
        }
        return returnSet;
    }

    // Creates an empty enum set with the specified element type.
    public static EnumSet<T> NoneOf() {
        return new EnumSet<T>();
    }

    // Returns a copy of the set passed in.
    public static EnumSet<T> CopyOf(EnumSet<T> set) {
        EnumSet<T> returnSet = new EnumSet<T>();
        returnSet.Add(set);
        return returnSet;
    }

    // Adds a set to an existing set.
    public void Add(EnumSet<T> enumSet) {
        foreach(T item in enumSet) {
            this.Add(item);
        }
    }

    // Removes a set from an existing set.
    public void Remove(EnumSet<T> enumSet) {
        foreach(T item in enumSet) {
            this.Remove(item);
        }
    }
}

0

আপনি প্রতিটি এনাম টাইপের জন্য একটি ইউটিলিটি ক্লাসও ব্যবহার করতে পারেন যা প্রতিটি এনাম মানের জন্য উন্নত ডেটা সহ একটি উদাহরণ রাখে।

public enum Planet
{
    MERCURY,
    VENUS
}

public class PlanetUtil
{
    private static readonly IDictionary<Planet, PlanetUtil> PLANETS = new Dictionary<Planet, PlanetUtil();

    static PlanetUtil()
    {
        PlanetUtil.PLANETS.Add(Planet.MERCURY, new PlanetUtil(3.303e+23, 2.4397e6));
        PlanetUtil.PLANETS.Add(Planet.VENUS, new PlanetUtil(4.869e+24, 6.0518e6));
    }

    public static PlanetUtil GetUtil(Planet planet)
    {
        return PlanetUtil.PLANETS[planet];
    }

    private readonly double radius;
    private readonly double mass;

    public PlanetUtil(double radius, double mass)
    {
        this.radius = radius;
        this.mass = mass;
    }

    // getter
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.