কনস্ট্রাক্টর বা ঘোষণার সময় ক্লাস ফিল্ডস আরম্ভ করবেন?


413

আমি সম্প্রতি সি # এবং জাভাতে প্রোগ্রামিং করেছি এবং আমি উত্সাহী যেখানে আমার ক্লাসের ক্ষেত্রগুলি সূচনা করার জন্য সেরা জায়গা।

আমি কি ঘোষণায় এটি করব ?:

public class Dice
{
    private int topFace = 1;
    private Random myRand = new Random();

    public void Roll()
    {
       // ......
    }
}

বা কোন নির্মাতায় ?:

public class Dice
{
    private int topFace;
    private Random myRand;

    public Dice()
    {
        topFace = 1;
        myRand = new Random();
    }

    public void Roll()
    {
        // .....
    }
}

আপনার মধ্যে কিছু অভিজ্ঞ যাঁরা মনে করেন এটি সর্বোত্তম অনুশীলন বলে আমি সত্যিই আগ্রহী। আমি ধারাবাহিক হতে চাই এবং একটি পদ্ধতির সাথে লেগে থাকতে চাই।


3
নোট করুন যে স্ট্রাক্টগুলির জন্য আপনার কাছে ফিল্ড আরম্ভকারী থাকতে পারে না, সুতরাং আপনার কনস্ট্রাক্টর ব্যবহার করা ছাড়া উপায় নেই।
yoyo

: আপনি "বেস্ট অনুশীলন" প্রতিপালিত যেহেতু satisfice.com/blog/archives/5164 , forbes.com/sites/mikemyatt/2012/08/15/best-practices-arent/...
স্টিফেন সি

উত্তর:


310

আমার নিয়ম:

  1. ঘোষণায় ডিফল্ট মান সঙ্গে আরম্ভ করবেন না ( null, false, 0, 0.0...)।
  2. আপনার যদি ক্ষেত্রের মান পরিবর্তন করে এমন কোনও কনস্ট্রাক্টর প্যারামিটার না থাকে তবে ঘোষণায় সূচনাটি পছন্দ করুন।
  3. যদি কোনও কনস্ট্রাক্টর প্যারামিটারের কারণে ক্ষেত্রের মান পরিবর্তিত হয় তবে কন্সট্রাক্টরগুলির মধ্যে আরম্ভ হয়।
  4. আপনার অনুশীলনে অবিচ্ছিন্ন থাকুন (সর্বাধিক গুরুত্বপূর্ণ নিয়ম)।

4
আমি প্রত্যাশা করি কোকোস এর অর্থ হল যে আপনি সদস্যদের তাদের ডিফল্ট মানগুলিতে (0, মিথ্যা, নাল ইত্যাদি) আরম্ভ করবেন না, যেহেতু সংকলকটি এটি আপনার জন্য করবে (1)) তবে আপনি যদি কোনও ক্ষেত্রকে এর ডিফল্ট মান ব্যতীত অন্য কোনও কিছুর কাছে সূচনা করতে চান, আপনার এটি ঘোষণাপত্রে করা উচিত (২)। আমি মনে করি এটি সম্ভবত "ডিফল্ট" শব্দের ব্যবহার যা আপনাকে বিভ্রান্ত করে।
রিকি হেলগসন

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

32
কোনও ধরণের ডিফল্ট মান default(T)সর্বদা এমন মান যা এর অভ্যন্তরীণ বাইনারি প্রতিনিধিত্ব করে 0
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

15
আপনার নিয়ম 1 পছন্দ হোক বা না হোক, এটি কেবল পঠনযোগ্য ক্ষেত্রগুলির সাথে ব্যবহার করা যাবে না, যা নির্মাণকারীর কাজ শেষ হওয়ার পরে স্পষ্টভাবে শুরু করা উচিত
yoyo

36
আমি যারা নিয়ম 1 এর সাথে একমত নই তাদের সাথে আমি একমত নই, অন্যরা সি # ভাষা শেখার আশা করা ঠিক আছে OK আমরা যেমন প্রতিটি foreachতালিকায় "তালিকার সমস্ত আইটেমের জন্য নিম্নলিখিতটি পুনরাবৃত্তি করে" মন্তব্য করি না, তেমনি আমাদের সি # এর ডিফল্ট মানগুলি ক্রমাগত পুনরুদ্ধার করতে হবে না। আমাদের সি-এর অবিচ্ছিন্ন শব্দার্থক শব্দ রয়েছে তা ভেবে দেখার দরকার নেই। যেহেতু কোনও মান অনুপস্থিতির স্পষ্ট অর্থ রয়েছে, তাই এটি ছেড়ে দেওয়া ভাল। যদি এটি সুস্পষ্ট হওয়ার আদর্শ হয় তবে newনতুন প্রতিনিধি তৈরি করার সময় আপনার সর্বদা ব্যবহার করা উচিত (যেমন সি # 1 তে প্রয়োজনীয় ছিল)। কিন্তু কে করে? ভাষা বিবেকবান কোডারদের জন্য তৈরি করা হয়েছে।
এডওয়ার্ড ব্রে

149

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

সর্বোত্তম অনুশীলনের নিরিখে পূর্ববর্তীটি আগেরটির চেয়ে কম ত্রুটিযুক্ত কারণ কেউ সহজেই অন্য কোনও নির্মাণকারী যুক্ত করতে পারে এবং এটি শৃঙ্খলা ভুলে যেতে পারে।


4
আপনি যদি getUninitializedObject দিয়ে ক্লাসটি আরম্ভ করতে চান তা সঠিক নয়। কর্টারে যা আছে তা স্পর্শ করা হবে না তবে মাঠের ঘোষণাগুলি চালানো হবে।
উলফ 5

28
আসলে এটা ব্যাপার। যদি বেস ক্লাসের কনস্ট্রাক্টর একটি ভার্চুয়াল পদ্ধতিতে কল করে (যা সাধারণত একটি খারাপ ধারণা, তবে ঘটতে পারে) যা উত্পন্ন শ্রেণিতে ওভাররাইড করা হয়, তবে উদাহরণটি ভেরিয়েবল ইনিশিয়ালাইজারগুলি ব্যবহার করে যখন পদ্ধতিটি বলা হয় তখন চলকটি আরম্ভ করা হবে - যেখানে প্রারম্ভিককরণ ব্যবহার করে কনস্ট্রাক্টর, তারা হবে না। ( বেস ক্লাসের কনস্ট্রাক্টর ডেকে আনার আগে ইনস্ট্যান্স ভেরিয়েবল ইনিশিয়েলাইজারগুলি কার্যকর করা হয়))
জন স্কিচ

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

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

1
@ কুইবলসোম, পূর্বেরটি একটি সমস্যা হবে, যদি মানটি নির্ধারিত হয় এবং ডাব্লুসিএফ পদ্ধতিতে দেওয়া হয়। যা মডেলটির ডিফল্ট ডেটা টাইপে ডেটা পুনরায় সেট করবে। সবচেয়ে ভাল অনুশীলনটি হল কনস্ট্রাক্টরের (পরে একটি) প্রাথমিককরণ করা।
প্রণেশ জনার্থনন

16

সি # এর শব্দার্থবিজ্ঞান এখানে জাভা থেকে কিছুটা আলাদা। সি # তে অ্যাসাইনমেন্ট সুপারিশ ক্লাস কনস্ট্রাক্টরকে কল করার আগে সম্পাদিত হয়। জাভাতে এটি তাত্ক্ষণিকভাবে সম্পন্ন করা হয় যার পরে 'এটি' ব্যবহারের অনুমতি দেওয়া হয় (বিশেষত বেনামে অভ্যন্তরীণ শ্রেণীর জন্য কার্যকর) এবং এর অর্থ এই যে দুটি রূপের শব্দার্থকতা সত্যই মিলছে।

আপনি যদি পারেন তবে ক্ষেত্রগুলি চূড়ান্ত করুন।


15

আমি মনে করি একটি ক্যাভেট আছে। আমি একবার এইরকম ত্রুটি করলাম: উত্পন্ন শ্রেণীর অভ্যন্তরে আমি একটি বিমূর্ত বেস শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত ক্ষেত্রগুলিকে "ঘোষণার সূচনা করতে" চেষ্টা করেছি। ফলাফলটি ছিল যে দুটি ক্ষেত্রের অস্তিত্ব রয়েছে, একটি হ'ল "বেস" এবং অন্যটি সদ্য ঘোষিত একটি এবং এটি আমার ডিবাগ করতে বেশ কিছুটা সময় ব্যয় করেছিল।

পাঠ: উত্তরাধিকার সূত্রে প্রাপ্ত ক্ষেত্রগুলি সূচনা করতে, আপনি এটি নির্মাণকারীর অভ্যন্তরেই করতে চান।


সুতরাং আপনি যদি ক্ষেত্রটি দ্বারা রেফার করে থাকেন derivedObject.InheritedFieldতবে এটি আপনার বেস এক বা উত্পন্ন একটিকে বোঝাচ্ছে?
রায়লু

6

আপনার উদাহরণের ধরণটি ধরে রেখে, নির্ধারকটিতে ক্ষেত্র আরম্ভ করতে অবশ্যই পছন্দ করুন। ব্যতিক্রমী মামলাগুলি হ'ল:

  • স্ট্যাটিক ক্লাস / পদ্ধতিতে ক্ষেত্রগুলি
  • ক্ষেত্রগুলি স্থির / চূড়ান্ত / ইত্যাদি হিসাবে টাইপ করা হয়

আমি সর্বদা বিষয়বস্তুর সারণী হিসাবে শ্রেণীর শীর্ষে ক্ষেত্রের তালিকাটি (এখানে কী রয়েছে তা কীভাবে এটি ব্যবহার করা হয় তা নয়) এবং ভূমিকা হিসাবে কনস্ট্রাক্টর হিসাবে মনে করি। পদ্ধতিগুলি অধ্যায়গুলি।


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

4

আমি যদি আপনাকে বলি, এটি নির্ভর করে?

আমি সাধারনত সবকিছু শুরু করি এবং ধারাবাহিক ভাবে করি do হ্যাঁ এটি অত্যধিক স্পষ্ট তবে এটি বজায় রাখাও একটু সহজ।

আমরা যদি পারফরম্যান্স নিয়ে চিন্তিত হয়ে থাকি তবে ভাল তবে আমি যা করতে হবে কেবল তা আরম্ভ করব এবং যে জায়গাগুলি বাক্সকে সবচেয়ে বেশি ধাক্কা দেয় সেগুলিতে এটি রাখি।

একটি রিয়েল টাইম সিস্টেমে, আমি প্রশ্ন করি আমার এমনকি যদি ভেরিয়েবল বা ধ্রুবকটি মোটেই প্রয়োজন।

এবং সি ++ এ আমি প্রায়শই কোনও জায়গায় আর কোনও প্রাথমিককরণের পাশেই না করে এটি এন্টার () ফাংশনে স্থানান্তরিত করি। কেন? ঠিক আছে, সি ++ এ আপনি যদি এমন কিছু শুরু করছেন যা অবজেক্ট নির্মাণের সময় একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে তবে আপনি নিজেকে মেমরি ফুটোতে খোলে।


4

বিভিন্ন এবং বিভিন্ন পরিস্থিতিতে আছে।

আমার শুধু খালি তালিকা দরকার

পরিস্থিতি স্পষ্ট। যখন কেউ তালিকায় কোনও আইটেম যুক্ত করে তবে আমার কেবল তালিকা তৈরি করতে হবে এবং একটি ব্যতিক্রম ছোঁড়া থেকে আটকাতে হবে।

public class CsvFile
{
    private List<CsvRow> lines = new List<CsvRow>();

    public CsvFile()
    {
    }
}

আমি মান জানি

আমি ঠিক জানি ডিফল্টরূপে আমার কী মান থাকতে হবে বা আমার অন্য কিছু যুক্তি ব্যবহার করা দরকার।

public class AdminTeam
{
    private List<string> usernames;

    public AdminTeam()
    {
         usernames = new List<string>() {"usernameA", "usernameB"};
    }
}

অথবা

public class AdminTeam
{
    private List<string> usernames;

    public AdminTeam()
    {
         usernames = GetDefaultUsers(2);
    }
}

সম্ভাব্য মান সহ খালি তালিকা

কখনও কখনও আমি অন্য নির্মাণকারীর মাধ্যমে মান যুক্ত করার সম্ভাবনা সহ ডিফল্টরূপে একটি খালি তালিকা আশা করি।

public class AdminTeam
{
    private List<string> usernames = new List<string>();

    public AdminTeam()
    {
    }

    public AdminTeam(List<string> admins)
    {
         admins.ForEach(x => usernames.Add(x));
    }
}

3

জাভাতে, ঘোষণার সাথে একটি ইনিশিয়ালাইজারের অর্থ ক্ষেত্রটি সর্বদা একইভাবে শুরু করা হয়, নির্বিশেষে কোন নির্মাতা ব্যবহার করা হয় (যদি আপনার একাধিক থাকে) বা আপনার নির্মাণকারীর পরামিতি (যদি তাদের যুক্তি থাকে) তবে পরবর্তীকালে কোনও নির্মাণকারী সম্ভবত মান পরিবর্তন করুন (এটি চূড়ান্ত না হলে)। সুতরাং একটি ঘোষণার সাহায্যে একটি ইনিশিয়ালাইজার ব্যবহার করে একজন পাঠককে পরামর্শ দেওয়া হয় যে আরম্ভিকৃত মানটি ক্ষেত্রের সমস্ত ক্ষেত্রেই সেই মান যা নির্ধারক নির্ধারিত প্যারামিটার নির্বিশেষে নির্ধারিত হয়। সুতরাং ঘোষণার সাথে একটি ইনিশিয়ালাইজারটি কেবলমাত্র যদি ব্যবহার করা হয় এবং সর্বদা যদি হয় তবে সমস্ত নির্মাণকৃত বস্তুর মান একই থাকে।


3

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

স্থির ক্ষেত্রের সূচনা সঙ্গে সামঞ্জস্যের বিষয়টিও রয়েছে, যা সেরা পারফরম্যান্সের জন্য ইনলাইন হওয়া দরকার। কনস্ট্রাক্টর ডিজাইনের ফ্রেমওয়ার্ক ডিজাইনের গাইডলাইনগুলি এটি বলে:

ON কনটসাইডার স্ট্যাটিক ফিল্ডগুলিকে স্পষ্টত স্ট্যাটিক কনস্ট্রাক্টর ব্যবহারের পরিবর্তে ইনলাইন প্রারম্ভিককরণের সূচনা করে কারণ রানটাইম এমন ধরণের পারফরম্যান্স অনুকূল করতে সক্ষম হয় যা স্পষ্টভাবে সংজ্ঞায়িত স্ট্যাটিক কনস্ট্রাক্টর নেই।

এই প্রসঙ্গে "বিবেচনা করুন" এর অর্থ এটি করার অর্থ যদি না থাকে তবে ভাল কারণ না থাকে। স্ট্যাটিক ইনিশিয়ালাইজার ক্ষেত্রের ক্ষেত্রে, ইনলাইন কোডিং করা খুব কম জটিল হলে প্রাথমিক কারণ হতে পারে।


2

ধারাবাহিক হওয়া গুরুত্বপূর্ণ, তবে নিজেকে প্রশ্ন করা এই প্রশ্ন: "আমার কি অন্য কোনও কিছুর জন্য নির্মাতা আছে?"

সাধারণত, আমি ডেটা স্থানান্তর করার জন্য এমন মডেল তৈরি করছি যে শ্রেণি নিজেই ভেরিয়েবলের আবাসন হিসাবে কাজ করে না।

এই পরিস্থিতিতে, আমার সাধারণত কোনও পদ্ধতি বা নির্মাণকারী নেই। আমার তালিকাগুলি সূচনা করার একচেটিয়া উদ্দেশ্যে একটি কনস্ট্রাক্টর তৈরি করা আমার কাছে বোকামি লাগবে, বিশেষত যেহেতু আমি তাদের সাথে ঘোষণার সাথে লাইনটি আরম্ভ করতে পারি।

অন্য অনেকে যেমন বলেছেন, এটি আপনার ব্যবহারের উপর নির্ভর করে। এটিকে সহজ রাখুন, এবং আপনার অতিরিক্ত কিছু করার দরকার নেই।


2

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


1

ঘোষণায় মান সেট করার ক্ষেত্রে সামান্য পারফরম্যান্স সুবিধা রয়েছে। যদি আপনি এটি কনস্ট্রাক্টারে সেট করেন তবে এটি দুটিবার সেট করা হচ্ছে (প্রথমে ডিফল্ট মান হিসাবে, তারপরে কোডারে পুনরায় সেট করুন)।


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

0

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

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


0

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

class MyGeneric<T>
{
    T data;
    //T data = ""; // <-- ERROR
    //T data = 0; // <-- ERROR
    //T data = null; // <-- ERROR        

    public MyGeneric()
    {
        // All of the above errors would be errors here in constructor as well
    }
}

এবং জেনেরিক ক্ষেত্রটিকে এর ডিফল্ট মান হিসাবে শুরু করার জন্য বিশেষ পদ্ধতিটি হ'ল:

class MyGeneric<T>
{
    T data = default(T);

    public MyGeneric()
    {           
        // The same method can be used here in constructor
    }
}

0

যখন আপনার কিছু যুক্তি বা ত্রুটি পরিচালনার প্রয়োজন হবে না:

  • ঘোষণায় শ্রেণীর ক্ষেত্রগুলি শুরু করুন

যখন আপনার কিছু যুক্তি বা ত্রুটি পরিচালনার দরকার হয়:

  • কনস্ট্রাক্টরে ক্লাস ফিল্ড আরম্ভ করুন

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

Https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html থেকে ।

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