কেন জাভা এনাম লিটারেলগুলি জেনেরিক ধরণের পরামিতি রাখতে সক্ষম হবে না?


148

জাভা এনামগুলি দুর্দান্ত। জেনেরিকস হয়। টাইপ ইরেজরের কারণে অবশ্যই আমরা সকলে পরবর্তী সীমাবদ্ধতাগুলি জানি। তবে একটি জিনিস আছে যা আমি বুঝতে পারি না, কেন আমি এই জাতীয় এনাম তৈরি করতে পারি না:

public enum MyEnum<T> {
    LITERAL1<String>,
    LITERAL2<Integer>,
    LITERAL3<Object>;
}

পরিবর্তে এই জেনেরিক ধরণের পরামিতিটি <T>বিভিন্ন স্থানে কার্যকর হতে পারে। কোনও পদ্ধতির জেনেরিক ধরণের পরামিতিটি কল্পনা করুন:

public <T> T getValue(MyEnum<T> param);

অথবা এমনকি এনাম শ্রেণিতেও:

public T convert(Object o);

আরও দৃ concrete় উদাহরণ # 1

যেহেতু উপরের উদাহরণটি কারও কারও কাছে বিমূর্ত মনে হতে পারে, কেন আমি এটি করতে চাই তার একটি আরও বাস্তব জীবনের উদাহরণ's এই উদাহরণে আমি ব্যবহার করতে চাই

  • এনামস, কারণ তখন আমি সম্পত্তি কীগুলির একটি সীমাবদ্ধ সংখ্যা গণনা করতে পারি
  • জেনারিক্স, কারণ তখন আমি সম্পত্তি রাখার জন্য পদ্ধতি-স্তরের টাইপ-সুরক্ষা পেতে পারি
public interface MyProperties {
     public <T> void put(MyEnum<T> key, T value);
     public <T> T get(MyEnum<T> key);
}

আরও দৃ concrete় উদাহরণ # 2

আমার কাছে ডেটা ধরণের একটি সংখ্যা রয়েছে:

public interface DataType<T> {}

public enum SQLDataType<T> implements DataType<T> {
    TINYINT<Byte>,
    SMALLINT<Short>,
    INT<Integer>,
    BIGINT<Long>,
    CLOB<String>,
    VARCHAR<String>,
    ...
}

প্রতিটি এনাম আক্ষরিক স্পষ্টতই জেনেরিক ধরণের উপর ভিত্তি করে অতিরিক্ত সম্পত্তি থাকবে <T>, একই সময়ে, একটি এনাম (অপরিবর্তনীয়, সিঙ্গলটন, গণনাযোগ্য ইত্যাদি) হবে)

প্রশ্ন:

কেউ কি ভেবে দেখেনি? এটি কি সংকলক সম্পর্কিত সীমাবদ্ধতা? এই সত্যটি বিবেচনা করে, " এনাম " কীওয়ার্ডটি সিনট্যাকটিক চিনির হিসাবে প্রয়োগ করা হয়েছে, জেভিএমকে উত্পন্ন কোডের প্রতিনিধিত্ব করে, আমি এই সীমাবদ্ধতাটি বুঝতে পারি না।

কে আমাকে এই ব্যাখ্যা করতে পারে? উত্তর দেওয়ার আগে এটিকে বিবেচনা করুন:

  • আমি জানি জেনেরিক প্রকারগুলি মুছে ফেলা হয় :-)
  • আমি জানি ক্লাস অবজেক্ট ব্যবহার করে ওয়ার্কআউন্ডস রয়েছে। তারা কর্মক্ষেত্রের।
  • জেনেরিক ধরণের ফলাফল প্রযোজ্য যেখানেই সংকলক-উত্পাদিত ধরণের কাস্টগুলিতে ঘটে (যেমন রূপান্তর () রূপে কল করার সময়)
  • জেনেরিক টাইপ <T> এনামে থাকবে। সুতরাং এটি এনামের আক্ষরিক প্রতিটি দ্বারা আবদ্ধ। তাই সংকলকটি জানতে পারে, কোনও জাতীয় লেখার সময় কোন প্রকারটি প্রয়োগ করতে হবেString string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
  • একই T getvalue()পদ্ধতিতে জেনেরিক ধরণের পরামিতিগুলির ক্ষেত্রে প্রযোজ্য । সংকলক কল করার সময় টাইপ কাস্টিং প্রয়োগ করতে পারেString string = someClass.getValue(LITERAL1)

3
আমি এই সীমাবদ্ধতা বুঝতে পারি না। আমি সম্প্রতি এটি পেরিয়ে এসেছি যেখানে আমার এনামটিতে বিভিন্ন "তুলনীয়" প্রকার রয়েছে এবং জেনেরিকের সাথে কেবল একই ধরণের তুলনামূলক ধরণের সতর্কতা ছাড়াই তুলনা করা যেতে পারে যা দমন করা দরকার (যদিও রানটাইমের সময় যথাযথগুলির সাথে তুলনা করা হবে)। কোন তুলনামূলক প্রকারটি সমর্থনযোগ্য তা নির্দিষ্ট করার জন্য এনামে আবদ্ধ টাইপ ব্যবহার করে আমি এই সতর্কতাগুলি থেকে মুক্তি পেতে পারতাম, তবে পরিবর্তে আমাকে সাপ্রেস ওয়ার্নিংস টীকাটি যুক্ত করতে হয়েছিল - এর চারপাশে কোনও উপায় নেই! যেহেতু তুলনাটো কোনওভাবেই কোনও শ্রেণীর কাস্ট ব্যতিক্রম ছুঁড়ে ফেলেছে, এটি আমার ধারণা ঠিক আছে তবে এখনও ...
MetroidFan2002

5
(+1) আমি আমার প্রকল্পের কোনও ধরণের সুরক্ষা ফাঁক বন্ধ করার চেষ্টা করার মাঝখানে আছি, এই স্বেচ্ছাসেবী সীমাবদ্ধতায় মারা গিয়েছি। কেবল এটি বিবেচনা করুন: enumজাভা 1.5 এর আগে আমরা ব্যবহার করেছি "টাইপসেফ এনাম" আইডিয়মে পরিণত করুন । হঠাৎ করে, আপনি আপনার এনাম সদস্যদের প্যারামিটারাইজ করতে পারেন। সম্ভবত আমি এখন এটি করতে যাচ্ছি।
মার্কো টপলনিক

1
@ এডউইন ডালোরজো: জওইউকিউ-র একটি দৃ concrete উদাহরণ দিয়ে প্রশ্নটি আপডেট করেছেন , যেখানে এটি অতীতে অত্যাধিক উপকারে আসত
লুকাস এদার

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

1
সম্পূর্ণ একমত. জেনারিক ব্যতীত এনাম পঙ্গু হয়। আপনার কেস # 1ও আমার। আমার যদি জেনেরিক এনামের প্রয়োজন হয় তবে আমি জেডিকে 5 ছেড়ে দিচ্ছি এবং এটি সাধারণ পুরানো জাভা 1.4 স্টাইলে প্রয়োগ করি। এই পদ্ধতির অতিরিক্ত সুবিধাও রয়েছে : আমি এক শ্রেণিতে বা এমনকি প্যাকেজে সমস্ত ধ্রুবক থাকতে বাধ্য হই না। সুতরাং, প্যাকেজ বাই বৈশিষ্ট্য শৈলী অনেক ভাল সম্পন্ন হয়। এটি কেবল কনফিগারেশনের মতো "এনামগুলিতে" উপযুক্ত - ধ্রুবকগুলি তাদের লজিক্যাল অর্থ অনুসারে প্যাকেজগুলিতে ছড়িয়ে পড়ে (এবং যদি আমি সেগুলি দেখতে চাই তবে আমার টাইপটি হাইয়ারারচি দেখানো হয়েছে)।
টমো জালুসকি

উত্তর:


50

এটি এখন JEP-301 এনহান্সড এনাম হিসাবে আলোচিত হচ্ছে । জেপিতে প্রদত্ত উদাহরণটি হ'ল যা আমি সন্ধান করছি ঠিক সেটাই:

enum Argument<X> { // declares generic enum
   STRING<String>(String.class), 
   INTEGER<Integer>(Integer.class), ... ;

   Class<X> clazz;

   Argument(Class<X> clazz) { this.clazz = clazz; }

   Class<X> getClazz() { return clazz; }
}

Class<String> cs = Argument.STRING.getClazz(); //uses sharper typing of enum constant

দুর্ভাগ্যক্রমে, জেপ এখনও তাত্পর্যপূর্ণ সমস্যাগুলির সাথে লড়াই করছে: http://mail.openjdk.java.net/pipermail/amber-spec-experts/2017- মাই /000041.html


2
ডিসেম্বর 2018 পর্যন্ত, আবার জেপি 301 এর আশেপাশে জীবনের কিছু লক্ষণ দেখা গিয়েছিল , তবে সেই আলোচনাটিকে স্কিমিং করা এটিকে পরিষ্কার করে দেয় যে সমস্যাগুলি এখনও সমাধানের বাইরে।
পন্ট

11

উত্তরটি প্রশ্নে রয়েছে:

টাইপ ইরেজরের কারণে

এই দুটি পদ্ধতির কোনওটিই সম্ভব নয়, যেহেতু যুক্তির ধরণটি মুছে ফেলা হয়।

public <T> T getValue(MyEnum<T> param);
public T convert(Object);

এই পদ্ধতিগুলি অনুধাবন করার জন্য আপনি যদিও আপনার এনামটি তৈরি করতে পারেন:

public enum MyEnum {
    LITERAL1(String.class),
    LITERAL2(Integer.class),
    LITERAL3(Object.class);

    private Class<?> clazz;

    private MyEnum(Class<?> clazz) {
      this.clazz = clazz;
    }

    ...

}

2
ঠিক আছে, মুছে ফেলা সংকলন সময়ে হয়। তবে সংকলক টাইপ-চেকগুলির জন্য জেনেরিক ধরণের তথ্য ব্যবহার করতে পারে। এবং তারপরে জেনেরিক টাইপকে কাস্ট টাইপ করতে "রূপান্তর" করে। আমি প্রশ্নটি পুনরায় বলব
লুকাশ এডার

2
নিশ্চিত নয় যে আমি সম্পূর্ণরূপে অনুসরণ করি। নিন public T convert(Object);। আমি অনুমান করছি যে এই পদ্ধতিটি উদাহরণস্বরূপ <টি> -এ বিভিন্ন ধরণের সংকীর্ণ হতে পারে, উদাহরণস্বরূপ একটি স্ট্রিং। স্ট্রিং অবজেক্টের নির্মাণ রানটাইম - সংকলক কিছুই করে না। সুতরাং আপনার স্ট্রিংক্লাসের মতো রানটাইম টাইপ জানতে হবে। নাকি আমি কিছু মিস করছি?
মার্টিন আলজেস্টেন

6
আমি মনে করি যে জেনেরিক টাইপ <T> এনামে রয়েছে (বা এর উত্পন্ন শ্রেণি) you're এনামের একমাত্র উদাহরণ হ'ল এর আক্ষরিক, যা সমস্ত ধ্রুবক জেনেরিক ধরণের বাঁধাই সরবরাহ করে। সুতরাং পাবলিক টি রূপান্তর (অবজেক্ট) তে টি সম্পর্কে কোনও অস্পষ্টতা নেই;
লুকাশ এডার

2
আহা! বুঝেছি. তুমি আমার চেয়ে চালাক :)
মার্টিন আলজেস্টেন

1
আমি অনুমান করি যে এটি এনামের জন্য ক্লাসে নেমে আসে অন্য কিছুর জন্য একইভাবে মূল্যায়ন করা হয়। জাভাতে, যদিও জিনিসগুলি অবিচ্ছিন্ন মনে হয় তবে তা হয় না। public final static String FOO;স্থির ব্লকের সাথে বিবেচনা করুন static { FOO = "bar"; }- সংকলনের সময় জানা থাকলেও ধ্রুবকগুলিও মূল্যায়ন করা হয়।
মার্টিন আলজেস্টেন

5

কারণ আপনি পারবেন না। সিরিয়াসলি। যে ভাষা অনুষঙ্গ যোগ করা যেতে পারে। এটা হয়নি। এটি কিছুটা জটিলতা যোগ করবে। ব্যয়ের পক্ষে এই সুবিধাটির অর্থ এটি কোনও উচ্চ অগ্রাধিকার নয়।

আপডেট: বর্তমানে JEP 301 এর অধীনে ভাষাতে যুক্ত হচ্ছে : বর্ধিত এনাম


আপনি জটিলতাগুলি বিস্তারিত বলতে পারেন?
মিঃ_আর_আমস_ডি

4
আমি এখন কয়েক দিন ধরে এটি নিয়ে ভাবছিলাম এবং আমি এখনও কোনও জটিলতা দেখতে পাচ্ছি না।
মার্কো টপলনিক

4

ENUM এ অন্যান্য পদ্ধতি রয়েছে যা কাজ করবে না। কি MyEnum.values()ফিরে আসবে?

কি হবে MyEnum.valueOf(String name)?

মানটির জন্য যদি আপনি ভাবেন যে সংকলক জেনেরিক পদ্ধতিটি তৈরি করতে পারে

পাবলিক স্ট্যাটিক MyEnum মানOf (স্ট্রিং নাম);

যাতে এটি কল করার জন্য MyEnum<String> myStringEnum = MyEnum.value("some string property"), এটি কোনও কাজ করে না। উদাহরণস্বরূপ আপনি কল যদি MyEnum<Int> myIntEnum = MyEnum.<Int>value("some string property")? সঠিকভাবে কাজ করার জন্য সেই পদ্ধতিটি প্রয়োগ করা সম্ভব নয়, উদাহরণস্বরূপ, যখন আপনি MyEnum.<Int>value("some double property")ক্ষয় টাইপের কারণে এটিকে কল করেন তখন ব্যতিক্রম ছুঁড়ে ফেলা বা নাল ফিরে দেওয়া ।


2
কেন তারা কাজ করবে না? তারা কেবল ওয়াইল্ডকার্ড ব্যবহার করবে ...: MyEnum<?>[] values()এবংMyEnum<?> valueOf(...)
লুকাশ এডার

1
তবে তারপরে আপনি MyEnum<Int> blabla = valueOf("some double property");এইভাবে অ্যাসাইনমেন্টটি করতে পারবেন না কারণ প্রকারগুলি উপযুক্ত নয়। এছাড়াও আপনি সেই ক্ষেত্রে নাল পেতে চান কারণ আপনি MyEnum <Int> ফিরে আসতে চান যা দ্বিগুণ সম্পত্তি নামের জন্য বিদ্যমান নেই এবং আপনি ক্ষয়জনিত কারণে এই পদ্ধতিটি সঠিকভাবে কাজ করতে পারবেন না।
ব্যবহারকারী 1944408

এছাড়াও যদি আপনি মানগুলির () দ্বারা লুপ করেন তবে আপনাকে মাইএনম <?> ব্যবহার করতে হবে যা আপনি সাধারণত যা চান তা নয় কারণ উদাহরণস্বরূপ আপনি কেবল আপনার ইন্ট বৈশিষ্ট্যগুলি লুপ করতে পারবেন না। এছাড়াও আপনাকে প্রচুর কাস্টিং করতে হবে যা আপনি এড়াতে চান, আমি প্রতিটি ধরণের জন্য আলাদা আলাদা এনাম তৈরি করার বা উদাহরণ দিয়ে নিজের শ্রেণি তৈরি করার পরামর্শ দেব ...
ব্যবহারকারী 1944408

ঠিক আছে, আমি অনুমান করি আপনার দুটোই থাকতে পারে না। সাধারণত, আমি আমার নিজের "এনাম" বাস্তবায়ন করি। এটির Enumমধ্যে রয়েছে অন্যান্য অনেক দরকারী বৈশিষ্ট্য এবং এটি একটি
optionচ্ছিক

0

সত্যি বলতে এটিকে কোনও কিছুর চেয়ে সমস্যার সন্ধানের মতো আরও অনেক সমস্যার সমাধান বলে মনে হয়।

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

একটি পাঠ্য বই এনুমের উদাহরণ নিন। এটি খুব দরকারী বা সামঞ্জস্যপূর্ণ নয়:

public enum Planet<T>{
    Earth<Planet>,
    Venus<String>,
    Mars<Long>
    ...etc.
}

আমি কেন আমার বিভিন্ন গ্রহগুলির বিভিন্ন জেনেরিক ধরণের রূপান্তর করতে চাই? এটি কোন সমস্যার সমাধান করে? এটি ভাষার শব্দার্থবিজ্ঞানকে জটিল করে তুলেছে কি? আমার যদি এই আচরণটি প্রয়োজন হয় তবে এটি অর্জনের জন্য একটি এনাম সেরা সরঞ্জাম?

অতিরিক্তভাবে আপনি কীভাবে জটিল রূপান্তর পরিচালনা করবেন?

এই ক্ষেত্রে

public enum BadIdea<T>{
   INSTANCE1<Long>,
   INSTANCE2<MyComplexClass>;
}

String Integerনাম বা অর্ডিনাল সরবরাহ করা এটি যথেষ্ট সহজ । তবে জেনেরিকগুলি আপনাকে যে কোনও প্রকারের সরবরাহ করতে দেয়। আপনি কীভাবে রূপান্তরটি পরিচালনা করবেন MyComplexClass? এখন আপনার দুটি সংস্থাগুলি সংকলককে জোর করে জেনারিক এনামগুলিতে সরবরাহ করা যেতে পারে এবং কনসেপ্টে অতিরিক্ত বিভ্রান্তি (জেনারিক্স) প্রবর্তন করা যেতে পারে যেগুলি ইতিমধ্যে প্রচুর প্রোগ্রামারকে বিচ্ছিন্ন করে দেয় জেনে জোর করে দুটি কনস্ট্রাক্টকে জোর করে const


17
উদাহরণস্বরূপ যেখানে এটি কার্যকর হবে না এমন একটি দু'দিক ভাবা একটি ভয়াবহ যুক্তি যে এটি কখনই কার্যকর হবে না।
ইলিয়াস ভ্যাসিলেনকো

1
উদাহরণগুলি বিষয়টিকে সমর্থন করে। এনাম উদাহরণগুলি হ'ল ধরণের (সুন্দর এবং সহজ) সাবক্লাস এবং জেনারিকগুলি সহ কীটগুলি এটি একটি অত্যন্ত অস্পষ্ট সুবিধার জন্য জটিলতার শর্ত। আপনি যদি আমাকে নীচে
নামতে চলেছেন

1
@ এনএসফাইন 55 এনাম জাভা অন্যতম জটিল, সবচেয়ে যাদু ভাষা বৈশিষ্ট্য। অন্য কোনও ভাষার বৈশিষ্ট্য নেই যা স্থির পদ্ধতিগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন করে। প্লাস, প্রতিটি enum টাইপ ইতিমধ্যে হয় একটি জেনেরিক ধরনের একটি দৃষ্টান্ত।
মার্কো টপলনিক

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

1
আমি আপনার বিরূপতার উল্লেখ লক্ষ্য করিনি ... জাভা এটি সমর্থন করে, কেবল এটি ব্যবহারের-সাইট, যা এটি কিছুটা অনর্থক করে তোলে। interface Converter<IN, OUT> { OUT convert(IN in); } <E> Set<E> convertListToSet(List<E> in, Converter<? super List<E>, ? extends Set<E>> converter) { return converter.convert(in); }আমাদের প্রত্যেকবার হ'ল ম্যানুয়ালিটি তৈরি করতে হবে যেটি কখন ব্যবহৃত হয় এবং কোনটি উত্পাদিত হয় এবং সেই অনুযায়ী সীমাগুলি নির্দিষ্ট করে।
মার্কো টপলনিক

-2

Becaue "enum" হল গণনার সংক্ষিপ্তসার। কোডটি আরও ভালভাবে পঠনযোগ্য করে তোলার জন্য এটি নামমাত্র ধাপের একটি সেট যা অর্ডিনাল সংখ্যার জায়গায় দাঁড়িয়ে।

টাইপ-প্যারামিটারাইজড ধ্রুবকটির উদ্দেশ্যযুক্ত অর্থ কী হতে পারে তা আমি দেখছি না।


1
ইন java.lang.String:public static final Comparator<String> CASE_INSENSITIVE_ORDER । এখন দেখুন? :-)
লুকাশ এডার

4
আপনি বলেছিলেন যে টাইপ-প্যারামিটারাইজড ধ্রুবকটির অর্থ কী হতে পারে তা আপনি দেখতে পান না। সুতরাং আমি আপনাকে একটি টাইপ-প্যারামিটারাইজড ধ্রুবক দেখিয়েছি (কোনও ফাংশন পয়েন্টার নয়)।
লুকাশ ইডার

অবশ্যই না, জাভা ভাষা যেমন ফাংশন পয়েন্টার হিসাবে কোনও জিনিস জানেন না। তবুও, ধ্রুবকটি টাইপ প্যারামিটারাইজড নয়, তবে এটি টাইপ। এবং টাইপ প্যারামিটার নিজেই ধ্রুবক, কোনও ধরণের পরিবর্তনশীল নয়।
ইনগো

তবে এনাম সিনট্যাক্সটি কেবল সিনট্যাকটিক চিনি। নীচে, তারা ঠিক এর মতো CASE_INSENSITIVE_ORDER... যদি Comparator<T>কোনও এনাম হয়, তবে কেন কোনও সম্পর্কিত আবদ্ধের সাথে অক্ষর ছিল না <T>?
লুকাশ এদার

যদি তুলনাকারী <T> একটি এনাম হয়, তবে প্রকৃতপক্ষে আমাদের কাছে সমস্ত ধরণের অদ্ভুত জিনিস থাকতে পারে। সম্ভবত পূর্ণসংখ্যার মতো <T> something তবে তা হয় না।
ইঙ্গো

-3

আমি মনে করি কারণ মূলত এনামদের উদাহরণ দেওয়া যায় না

আপনি টি ক্লাসটি কোথায় স্থাপন করবেন, যদি জেভিএম আপনাকে এটি করার অনুমতি দেয়?

গণনা হ'ল এমন ডেটা যা সর্বদা একরকম বলে মনে করা হয় বা কমপক্ষে এটি ডায়নামিকভাবে পরিবর্তিত হয় না।

নতুন MyEnum <> ()?

তবুও নিম্নলিখিত পদ্ধতি কার্যকর হতে পারে

public enum MyEnum{

    LITERAL1("s"),
    LITERAL2("a"),
    LITERAL3(2);

    private Object o;

    private MyEnum(Object o) {
        this.o = o;
    }

    public Object getO() {
        return o;
    }

    public void setO(Object o) {
        this.o = o;
    }   
}

8
নিশ্চিত না যে আমি setO()পদ্ধতিটি পছন্দ করি enum। আমি এনামের ধ্রুবককে এবং আমার কাছে এটি অপরিবর্তনীয় বলে বিবেচনা করি । সুতরাং এটি সম্ভব হলেও, আমি এটি করব না।
মার্টিন আলজেস্টেন

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

2
এনামগুলিতে সেটটারগুলি সম্পূর্ণ স্বাভাবিক। বিশেষত যদি আপনি একটি সিঙ্গলটন তৈরি করতে এনাম ব্যবহার করেন (যোশুয়া ব্লচের আইটেম 3 কার্যকর জাভা)
প্রেস্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.