কোন ক্লাসে কনস্ট্রাক্টর প্রাইভেট তৈরির ব্যবহার কী?


134

আমরা কেন ক্লাসে কনস্ট্রাক্টরকে প্রাইভেট করব? যেমন সর্বদা জনসাধারণের কাছে কনস্ট্রাক্টর দরকার।

উত্তর:


129

আপনার ব্যক্তিগত নির্মাণকারীর প্রয়োজন হতে পারে এমন কয়েকটি কারণ:

  1. কনস্ট্রাক্টর কেবলমাত্র ক্লাসের মধ্যে স্থির কারখানা পদ্ধতি থেকে অ্যাক্সেস করতে পারে । সিঙ্গলটনও এই বিভাগে অন্তর্ভুক্ত থাকতে পারে।
  2. একটি ইউটিলিটি ক্লাস , এতে কেবল স্থির পদ্ধতি থাকে।

9
এমনকি আমি কোনও ইউটিলিটি ক্লাসের জন্য একটি প্রাইভেট কনস্ট্রাক্টর তৈরি করাও বিরক্ত করতাম না।
পিটেশ

16
@ পতেশ: এটি আপনার সিদ্ধান্ত। অন্য (গুলি) এবং আমি বরং এক লাইনের প্রাইভেট কনস্ট্রাক্টর ছাড়ার চেয়ে ইউটিলিটি ক্লাসের ইনস্ট্যান্টেশন বন্ধ করতে চাই।
নন্দ

1
কিছু প্রোগ্রামিং ভাষায় (উল্লেখযোগ্যভাবে জাভা) এটি উত্তরাধিকারকেও প্রতিরোধ করে
ডিএফএ

9
@ ডিএফএ: উত্তরাধিকার রোধ করতে আপনাকে finalশ্রেণী স্তর স্থাপন করতে হবে। প্রাইভেট কনস্ট্রাক্টর রাখা এই কারণে বেশ বেহুদা।
নন্দ

3
@ উইল: আপনি যদি প্রতিবিম্ব ব্যবহার করেন তবে তা নয়। কনস্ট্রাক্টরগুলি বেসরকারী ঘোষণার উদ্দেশ্য ইনস্ট্যান্টেশন (প্রতিফলন ব্যতীত) রোধ করার উদ্দেশ্যে, তবে সাবক্লাসিং প্রতিরোধ করা একটি পার্শ্ব প্রতিক্রিয়া, উদ্দেশ্য নয়। এর জন্য উপযুক্ত সরঞ্জামটি ক্লাসটি ঘোষণা করছে final। স্ট্রিং ক্লাসের জন্য সান এটি করেছিল এবং এপিআইয়ের যুক্তিসঙ্গত অংশ যা প্রসারিত করা উচিত নয়।
ববএমসিজি

96

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

উ: আপনার শ্রেণীর উদাহরণগুলি একটি staticপদ্ধতিতে তৈরি করা হয়েছে । staticপদ্ধতি তারপর হিসেবে ঘোষণা করা হয় public

class MyClass()
{
private:
  MyClass() { }

public:
  static MyClass * CreateInstance() { return new MyClass(); }
};

বি। আপনার ক্লাসটি একটি সিঙ্গলটন । এর অর্থ, প্রোগ্রামে আপনার শ্রেণীর একের বেশি উদাহরণ উপস্থিত নেই।

class MyClass()
{
private:
  MyClass() { }

public:
  MyClass & Instance()
  {
    static MyClass * aGlobalInst = new MyClass();
    return *aGlobalInst;
  }
};

সি। (কেবলমাত্র আসন্ন সি ++ 0x মানের ক্ষেত্রে প্রযোজ্য) আপনার বেশ কয়েকটি কনস্ট্রাক্টর রয়েছে। তাদের মধ্যে কিছু ঘোষণা করা হয় public, অন্যরা private। কোডের আকার হ্রাস করার জন্য, পাবলিক কনস্ট্রাক্টররা 'কল' বেসরকারী কন্সট্রাক্টররা ঘুরেফিরে সমস্ত কাজ করে। আপনার publicকনস্ট্রাক্টরগুলিকে ডেলিগেটিং কনস্ট্রাক্টর বলা হয় :

class MyClass
{
public:
  MyClass() : MyClass(2010, 1, 1) { }

private:
  MyClass(int theYear, int theMonth, int theDay) { /* do real work */ }
};

D. আপনি অবজেক্ট অনুলিপি সীমাবদ্ধ করতে চান (উদাহরণস্বরূপ, শেয়ার্ড রিসোর্স ব্যবহারের কারণে):

class MyClass
{
  SharedResource * myResource;

private:
  MyClass(const MyClass & theOriginal) { }
};

E. আপনার ক্লাসটি একটি ইউটিলিটি ক্লাস । তার মানে, এটিতে কেবল staticসদস্য রয়েছে । এই ক্ষেত্রে, প্রোগ্রামে কোনও বস্তুর উদাহরণ তৈরি করা আবশ্যক।


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

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

12

একটি "পিছনের দরজা" রেখে যা অন্য বন্ধু শ্রেণি / ফাংশনটিকে ব্যবহারকারীর জন্য নিষিদ্ধ উপায়ে একটি অবজেক্ট তৈরি করতে দেয়। একটি উদাহরণ যা মনে আসে তা হ'ল একটি পুনরুক্তি (সি ++) তৈরির ধারক হবে:

Iterator Container::begin() { return Iterator(this->beginPtr_); }
// Iterator(pointer_type p) constructor is private,
//     and Container is a friend of Iterator.

টেরি কি এটি যথেষ্ট আলাদা? ;)
এমিল Cormier

ভাল উত্তর. প্রতিবিম্বের কথা কেন উল্লেখ করবেন না, যেহেতু এটি ব্যবহারকারী কিছু করতে পারে না তার জন্য এটি একটি উপায়?
ববএমসিজি

@ বোবি: আপনাকে আমাকে সেই বিষয়ে আলোকিত করতে হবে, কারণ আমি মূলত একজন সি ++ লোক এবং প্রতিচ্ছবি সত্যই সি ++ শব্দভাণ্ডারে নেই। ;)
এমিল কর্মিয়ার

3
কেউ এটি পড়তে যাচ্ছে না, তবে এখানে যায়: আমি এই বারে কয়েকবার হ্রাস পেয়েছি। মন খারাপ বা কিছু নয়, তবে (শেখার জন্য) আমি জানতে চাই কেন এটি খারাপ? কোনও ধারকটির ডেটা অ্যাক্সেস করার জন্য যে ডেটারের প্রয়োজন হবে সেই ডেটা দিয়ে কীভাবে অন্যটি তৈরি করা যেতে পারে?
এমিল Cormier

2
@ এমিলিকোর্মিয়ার, আমি মনে করি আপনি অন্যায়ভাবে নিচে ভোট পেয়েছেন কারণ সি ++ শিখার লোকদের বারবার বলা হয়: "বন্ধুত্বের ঘোষণা এড়ানো" " এই পরামর্শটি অনভিজ্ঞ সি ++ প্রোগ্রামারদের উদ্দেশ্যে করা বলে মনে হয়েছে যারা অন্যথায় friendএটি সুনির্দিষ্টভাবে ব্যবহার করতে পারে না — এবং এটির একটি খারাপ ধারণা এমন অনেকগুলি ক্ষেত্রে রয়েছে। দুঃখের বিষয়, বার্তাটি খুব ভালভাবে গ্রহণ করা হয়েছে, এবং অনেক বিকাশকারী কখনই ভাষাটি এতটা ভালভাবে শিখতে পারে না যে মাঝে মধ্যে ব্যবহার friendকেবলমাত্র গ্রহণযোগ্য নয়, তবে তার চেয়ে বেশি পছন্দযোগ্য । আপনার উদাহরণটি ঠিক এরকম একটি ঘটনা ছিল। ইচ্ছাকৃত দৃ strong় মিলন কোনও অপরাধ নয়, এটি একটি ডিজাইনের সিদ্ধান্ত।
এভিয়েডফ্লো

10

প্রত্যেকে সিঙ্গেলটন জিনিসটির উপর আটকে আছে, বাহ!

অন্য জিনিস:

  • লোকটিকে আপনার ক্লাসটি স্ট্যাকের উপরে তৈরি করা থেকে বিরত করুন; কারখানা পদ্ধতিতে ব্যক্তিগত কন্সট্রাক্টর এবং কেবল ব্যাক পয়েন্টারগুলি তৈরি করুন।
  • ক্লাসের অনুলিপি তৈরি করা রোধ করা হচ্ছে (ব্যক্তিগত অনুলিপি নির্মাণকারী)

8

এটি এমন একটি কনস্ট্রাক্টরের পক্ষে খুব কার্যকর হতে পারে যাতে প্রচলিত কোড থাকে; 'এটি (...)' ব্যবহার করে অন্যান্য কনস্ট্রাক্টর দ্বারা বেসরকারী কনস্ট্রাক্টরদের ডাকা যেতে পারে; স্বরলিপি। একটি প্রাইভেট (বা সুরক্ষিত) কনস্ট্রাক্টরে সাধারণ সূচনা কোড তৈরি করে আপনি স্পষ্টভাবে পরিষ্কার করে দিচ্ছেন যে এটি কেবল নির্মাণের সময় ডাকা হয়, এটি কেবল কোনও পদ্ধতি যদি না হয় তবে:

public class Point {
   public Point() {
     this(0,0); // call common constructor
   }
   private Point(int x,int y) {
     m_x = x; m_y = y;
   }
};

3

কিছু উদাহরণ রয়েছে যেখানে আপনি পাবলিক কনস্ট্রাক্টর ব্যবহার করতে নাও চান; উদাহরণস্বরূপ, যদি আপনি একটি একক ক্লাস চান।

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


3

এটি নিশ্চিত করে যে আপনার (ব্যক্তিগত নির্মাণকারী সহ শ্রেণি) কনট্রাক্টরকে কীভাবে ডাকা হয় তা নিয়ন্ত্রণ করে।

উদাহরণ: কারখানার স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি বস্তুগুলিকে ফেরত দিতে পারে কারণ কারখানার পদ্ধতি তাদের বরাদ্দ দেওয়ার জন্য পছন্দ করে (উদাহরণস্বরূপ সিঙ্গলটন কারখানার মতো)।


@ স্কিলড্রিক: এর একটি উদাহরণ হ'ল আপনি কোনও শ্রেণিকে কেবলমাত্র গাদা বরাদ্দ করতে বাধ্য করতে পারেন।
ডার্ক

@ ডির্ক আমি আমার মন্তব্য মুছে ফেলেছি কারণ এটি আর প্রাসঙ্গিক নয়।
স্কিলড্রিক

3

কেবলমাত্র নির্দিষ্ট শ্রেণি দ্বারা সুরক্ষার জন্য (সুরক্ষার কারণে) আমাদের প্রাইভেট কনস্ট্রাক্টর থাকতে পারে।

এটি করার একটি উপায় হ'ল বন্ধুর ক্লাস করা।

সি ++ উদাহরণ:

class ClientClass;
class SecureClass 
{
  private:
    SecureClass();   // Constructor is private.
    friend class ClientClass;  // All methods in 
                               //ClientClass have access to private
                               // &   protected methods of SecureClass.
};

class ClientClass
{
public:
    ClientClass();
    SecureClass* CreateSecureClass()
     { 
           return (new SecureClass());  // we can access 
                                        // constructor of 
                                        // SecureClass as 
                                        // ClientClass is friend 
                                        // of SecureClass.
     }
};

দ্রষ্টব্য: দ্রষ্টব্য: কেবল ক্লায়েন্টক্লাস (যেহেতু এটি সিকিউর ক্লাসের বন্ধু) সিকিউর ক্লাসের কনস্ট্রাক্টরকে কল করতে পারে।


2

2

যখন আপনি চান না যে ব্যবহারকারীরা এই শ্রেণীর উদাহরণ তৈরি করতে বা এই শ্রেণীর উত্তরাধিকার সূত্রে ক্লাস তৈরি করতে চান, যেমন java.lang.mathএই প্যাকেজের staticসমস্ত ফাংশন math, উদাহরণস্বরূপ তৈরি না করেই সমস্ত ফাংশন কল করা যেতে পারে , সুতরাং নির্মাণকারী স্থির হিসাবে ঘোষণা করা হয় ।


1

যদি এটি ব্যক্তিগত হয় তবে আপনি এটিকে কল করতে পারবেন না ==> আপনি ক্লাসটি ইনস্ট্যান্ট করতে পারবেন না। সিঙ্গলটনের মতো কিছু ক্ষেত্রে কার্যকর।

এখানে একটি আলোচনা এবং আরও কয়েকটি উদাহরণ রয়েছে


1

আমি আপনার কাছ থেকে একই প্রশ্ন সম্বোধন করে একটি প্রশ্ন দেখেছি।

কেবলমাত্র যদি আপনি অন্যকে দৃষ্টান্ত তৈরি করতে না চান, তবে কনডাক্টরটিকে একটি সীমিত সুযোগের মধ্যে রাখুন। ব্যবহারিক প্রয়োগ (উদাহরণস্বরূপ) হ'ল সিঙ্গলটন প্যাটার্ন।


1

আপনি করা উচিত নয় কন্সট্রাকটর ব্যাক্তিগত করা হবে। সময়কাল। এটিকে সুরক্ষিত করুন, যাতে আপনার প্রয়োজন হলে ক্লাসটি বাড়িয়ে দিতে পারেন।

সম্পাদনা: আমি যে পাশে আছি তা কতই না নিম্নমুখী হলেও তা আমি দাঁড়িয়ে আছি। আপনি কোডটিতে ভবিষ্যতের বিকাশের সম্ভাবনা কেটে ফেলছেন। যদি অন্য ব্যবহারকারী বা প্রোগ্রামাররা সত্যই ক্লাসটি প্রসারিত করার জন্য দৃ determined়প্রতিজ্ঞ হয়, তবে তারা কেবল নির্মাতাকে উত্স বা বাইকোডে সুরক্ষিতভাবে পরিবর্তন করবে। তাদের জীবনকে আরও শক্ত করার জন্য আপনি কিছু করতে পারেন নি। আপনার নির্মাণকারীর মন্তব্যে একটি সতর্কতা অন্তর্ভুক্ত করুন এবং এটি এ ছেড়ে দিন।

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

বৈধ ব্যবহার:

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

2
আমার অভিজ্ঞতায় কোনও নিখুঁত সত্য নেই, এমনকি পরিস্থিতি যদি এটির দাবি করে তবে গোটো ব্যবহার করা যেতে পারে। খারাপ এবং দুষ্ট উপায় আছে, তবে মার্শাল ক্লাইন যেমন রাখে, কখনও কখনও আপনাকে কম খারাপের মধ্যে পছন্দ করতে হবে। parashift.com/c++-faq-lite/big-picture.html#faq-6.15 ব্যক্তিগত কন্সট্রাক্টর হিসাবে, তারা প্রয়োজনীয় এবং আপনার পক্ষে খারাপও নয়। এর অর্থ হ'ল আপনার সাবক্লাস সহ অন্য কেউ এটি ব্যবহার করবেন না।
daramarak

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

নির্মাণ বা অনান্য কিছু ক্লাস নির্মাণের অনুলিপি করার কোনও মানে হয় না । সি ++ এ আপনি এটি নির্ধারণ না করে একটি প্রাইভেট সিটার ঘোষণা করে ইঙ্গিত করেন (এটি অপারেটর = এর পক্ষেও সাধারণ)।

জাভা জেআইটি এবং জিডাব্লুটিটির মতো সংকলকগুলি প্রকৃতপক্ষে বেসরকারী নির্মাণকারীদের ব্যবহার করে: তাত্ক্ষণিকতার সীমাতে সীমাবদ্ধ রাখতে এবং আপনার কোডটি ইনলাইনিং / ছাঁটাই করে আরও ভাল কাজ করে।
আজাক্স

1

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

#include<iostream>
using namespace std;
class singletonClass
{


    static int i;
    static singletonClass* instance;
public:


    static singletonClass* createInstance()
    {


        if(i==0)
        {

            instance =new singletonClass;
            i=1;

        }

        return instance;

    }
    void test()
    {

        cout<<"successfully created instance";
    }
};

int singletonClass::i=0;
singletonClass* singletonClass::instance=NULL;
int main()
{


    singletonClass *temp=singletonClass::createInstance();//////return instance!!!
    temp->test();
}

আবার আপনি যদি 10 অবধি অবজেক্ট তৈরির সীমাবদ্ধ করতে চান তবে নীচেরটি ব্যবহার করুন

#include<iostream>
using namespace std;
class singletonClass
{


    static int i;
    static singletonClass* instance;
public:


    static singletonClass* createInstance()
    {


        if(i<10)
        {

            instance =new singletonClass;
            i++;
            cout<<"created";

        }

        return instance;

    }
};

int singletonClass::i=0;
singletonClass* singletonClass::instance=NULL;
int main()
{


    singletonClass *temp=singletonClass::createInstance();//return an instance
    singletonClass *temp1=singletonClass::createInstance();///return another instance

}

ধন্যবাদ


1

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

class C
{
public:
    C(int x);

private:
    C();
    C(const C &);
};

বৈধ নয় এমন ডিফল্ট কনস্ট্রাক্টরগুলির সাথে ব্যবহারকারীদের অবজেক্টটি ব্যবহার থেকে বিরত রাখতে সংকলকটি ব্যবহার করুন।


2
আপনি যখন ডিফল্ট কনস্ট্রাক্টর নির্দিষ্ট না করে একটি অ-ডিফল্ট কনস্ট্রাক্টর সরবরাহ করেন, তখন ডিফল্ট কনস্ট্রাক্টর উপস্থিত থাকে না। এটিকে তৈরি এবং ব্যক্তিগত করার দরকার নেই।
TT_

0

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

( সম্পাদনা: মন্তব্য অনুসারে এটি এমন কিছু যা কেবল জাভার ক্ষেত্রে প্রযোজ্য হতে পারে, অন্য কোনও OO ভাষায় এই নির্মাণটি প্রযোজ্য / প্রয়োজন হয় কিনা তা আমি অসচেতন (সি ++ বলুন))

নীচের মত একটি উদাহরণ:

public class Constants {
    private Contants():

    public static final int ADDRESS_UNIT = 32;
    ...
}

EDIT_1 : আবার, নীচে ব্যাখ্যা জাভায় প্রযোজ্য: (এবং কার্যকর জাভা বইটি থেকে উল্লেখ করে )

নীচের মত ইউটিলিটি ক্লাসের একটি ইনস্ট্যান্টেশন ক্ষতিকারক না হলেও এটি কোনও উদ্দেশ্য করে না কারণ সেগুলি তাত্ক্ষণিকভাবে নকশাকৃত করার জন্য ডিজাইন করা হয়নি।

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

unit = (this.length)/new Constants().ADDRESS_UNIT;

মত কোডের বিপরীতে

unit = (this.length)/Constants.ADDRESS_UNIT;

এছাড়াও আমি মনে করি যে কোনও প্রাইভেট কনস্ট্রাক্টর কনস্ট্যান্টস ( ডিজাইন ) শ্রেণির ডিজাইনারের অভিপ্রায়টি আরও ভালভাবে জানায় ।

জাভা একটি ডিফল্ট প্যারামিটারলেস পাবলিক কনস্ট্রাক্টর সরবরাহ করে যদি কোনও কনস্ট্রাক্টর সরবরাহ না করা হয় এবং যদি আপনার উদ্দেশ্য ইনস্ট্যান্টেশন রোধ করা হয় তবে একটি প্রাইভেট কনস্ট্রাক্টর প্রয়োজন।

কেউ শীর্ষ স্তরের শ্রেণীর স্থিতিশীল চিহ্নিত করতে পারে না এবং এমনকি একটি চূড়ান্ত শ্রেণি ইনস্ট্যান্ট করা যায়।


2
তবে সি ++ এ জন্য আপনার কোনও ক্লাসের দরকার নেই। যদি কোনও বস্তুর অভ্যন্তরের ডেটা নির্ভর করে না, তবে এটি বিনামূল্যে ফাংশন এবং বিনামূল্যে ভেরিয়েবল হিসাবে লিখুন। এনক্যাপসুলেশন চান? একটি নেমস্পেস ব্যবহার করুন।
daramarak

@ ডারামারাক: ধন্যবাদ, সি ++ নিয়ে আমার কোনও অভিজ্ঞতা নেই। আমি উত্তরটি আপডেট করেছি যে এটি শুধুমাত্র জাভাতে প্রযোজ্য
সতীশ

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

@ BobMcGee, আপনার মন্তব্যের জন্য ধন্যবাদ। এটি আমাকে কী পোস্ট করেছে সে সম্পর্কে আরও চিন্তা করতে (এবং উল্লেখ করুন) তৈরি করে। বেসরকারী নির্মাণকারীর উপযোগিতা সম্পর্কে আরও যুক্তি যুক্ত করতে আমি আমার উত্তর সম্পাদনা করেছি।
সতীশ

0

ইউটিলিটি ক্লাসে ব্যক্তিগত নির্মাণকারী থাকতে পারে। ক্লাসগুলির ব্যবহারকারীরা এই ক্লাসগুলি ইনস্ট্যান্ট করতে সক্ষম হবেন না:

public final class UtilityClass {
    private UtilityClass() {}

    public static utilityMethod1() {
        ...
    }
}

1
ইউটিলিটি শ্রেণি তাত্ক্ষণিকভাবে চালিত হয় কেন এটি বিবেচনা করে? এটি কেবল কোনও ক্ষেত্রবিহীন একটি অবজেক্ট তৈরি করা এবং কয়েক বাইট মেমরি খাওয়া।
ববএমসিজি

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

@ BobMcGee: স্পষ্টতই একটি শ্রেণীর নকশা করা যা কাজ করে এবং অন্যান্য লোকেরা ব্যবহার করার জন্য একটি শ্রেণি নকশা করা বিভিন্ন জিনিস। যারা এপিআই বিকাশে কাজ করে (যেমন সান লোক বা গুগল সংগ্রহ লোক) যে কোনও ইউটিলিটি ক্লাসে প্রাইভেট কনস্ট্রাক্টর অকেজো বলে বলার চেষ্টা করে যে কাউকে মেরে ফেলবে।
নন্দ

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

1
@ BobMcGee: আপনি সূর্যের থেকে উদাহরণটি দেখতে ভাল লাগছেন seems তারপরে এই ইউটিলিটি ক্লাসের সংগ্রহগুলি সূর্যের থেকে পরীক্ষা করুন: ডক্জার.এইচটিএমএল / এপি / জাভা / ইউটিলি / সংগ্রহগুলি.জভা এইচটিএমএল । এটি প্রকৃতপক্ষে প্রাইভেট কনস্ট্রাক্টর ব্যবহার করছে।
নন্দ

0

আপনি কোনও ক্লাসকে অবাধে ইনস্ট্যান্ট করাতে বাধা দিতে চাইতে পারেন prevent উদাহরণ হিসাবে সিঙ্গলটন ডিজাইনের প্যাটার্নটি দেখুন। স্বতন্ত্রতার গ্যারান্টি দেওয়ার জন্য, আপনি কাউকে এটির উদাহরণ তৈরি করতে দিতে পারবেন না :-)


0

অন্যতম গুরুত্বপূর্ণ ব্যবহার হ'ল সিঙ্গলটন ক্লাসে

class Person
{
   private Person()
   {
      //Its private, Hense cannot be Instantiated
   }

   public static Person GetInstance()
   {
       //return new instance of Person
       // In here I will be able to access private constructor
   }
};

এটিও উপযুক্ত, যদি আপনার শ্রেণিতে কেবল স্থির পদ্ধতি থাকে। অর্থ্যাৎ আপনার ক্লাসটি ইনস্ট্যান্ট করার দরকার নেই কারও


এটি লক্ষ করা উচিত যে সিঙ্গলটনকে অনেকে "অ্যান্টি-প্যাটার্ন" হিসাবে বিবেচনা করেন এবং এটি প্রয়োগ করার সিদ্ধান্তটি হালকাভাবে করা উচিত নয়। একটি সাধারণ বিকল্প হ'ল নির্ভরতা ইনজেকশন।
মাইকেল অ্যারন সাফিয়ান

সিঙ্গেলন কোনও অ্যান্টি-প্যাটার্ন নয়। তবে, প্যাটার্নের অতিরিক্ত ব্যবহার (এটির ব্যবহার সম্পর্কে জ্ঞানের অভাবের কারণে) ভাল নয়। এটি লক্ষ্য করা উচিত যে এটি জিওএফ প্যাটার্নগুলির একটি।
সিসএডমিন 13

0

এটি সত্যই একটি স্পষ্ট কারণ: আপনি একটি বস্তু তৈরি করতে চান, তবে এটি নির্মাণের মধ্যে (ইন্টারফেসের শর্তে) এটি করা ব্যবহারিক নয়।

Factoryউদাহরণস্বরূপ বেশ সুস্পষ্ট, আমাকে প্রকট দিন Named Constructorবাগ্ধারা।

বলুন আমার একটি ক্লাস রয়েছে Complexযা একটি জটিল সংখ্যার প্রতিনিধিত্ব করতে পারে।

class Complex { public: Complex(double,double); .... };

প্রশ্নটি হল: নির্মাতা কি বাস্তব এবং কল্পিত অংশগুলি প্রত্যাশা করে, বা এটি আদর্শ এবং কোণ (পোলার স্থানাঙ্ক) প্রত্যাশা করে?

ইন্টারফেসটিকে আরও সহজ করার জন্য আমি এটি পরিবর্তন করতে পারি:

class Complex
{
public:
  static Complex Regular(double, double = 0.0f);
  static Complex Polar(double, double = 0.0f);
private:
  Complex(double, double);
}; // class Complex

এটিকে Named Constructorআইডিয়ম বলা হয় : ক্লাসটি কেবল স্ক্র্যাচ থেকে স্পষ্ট করে বলা যেতে পারে যে আমরা কোন নির্মাণকারীর ব্যবহার করতে চাই।

এটি অনেকগুলি নির্মাণ পদ্ধতির একটি বিশেষ ক্ষেত্রে। নকশা নিদর্শন বিল্ড বস্তু উপায়ে একটি ভাল নম্বর প্রদান: Builder, Factory, Abstract Factory, ... এবং একটি প্রাইভেট কন্সট্রাকটর নিশ্চিত করবে যে ব্যবহারকারী সঠিকভাবে সীমাবদ্ধ।


0

সুপরিচিত ব্যবহারগুলি ছাড়াও ...

মেথড অবজেক্ট প্যাটার্নটি বাস্তবায়নের জন্য , আমি এর সংক্ষিপ্তসারটি করব:

"প্রাইভেট কনস্ট্রাক্টর, পাবলিক স্ট্যাটিক পদ্ধতি"
"বাস্তবায়নের জন্য অবজেক্ট, ইন্টারফেসের জন্য ফাংশন"

যদি আপনি কোনও অবজেক্টটি ব্যবহার করে কোনও ফাংশন বাস্তবায়ন করতে চান এবং কোনও এক-অফ গণনা (কোনও পদ্ধতি কল দ্বারা) করার বাইরে বস্তুটি কার্যকর না হয় তবে আপনার কাছে একটি থ্রোওয়ে অবজেক্ট রয়েছে । আপনি এই সাধারণ অ্যান্টি-প্যাটার্নটিকে প্রতিরোধ করে একটি স্থির পদ্ধতিতে অবজেক্ট তৈরি এবং পদ্ধতি কলকে সজ্জিত করতে পারেন:

z = new A(x,y).call();

... এটি একটি (নেমস্পিড) ফাংশন কল দিয়ে প্রতিস্থাপন করা:

z = A.f(x,y);

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

উদাহরণস্বরূপ, যদি আপনি পদ্ধতি জুড়ে একটি গণনার ভেঙ্গে করতে চান তাহলে foo, barএবং zorkএবং ফাংশন আউট, আপনি এটি বাস্তবায়ন হতে পারে নিম্নরূপ অনেক মান পাস না করেও ভাগ অবস্থায় উদাহরণস্বরূপ:

class A {
  public static Z f(x, y) {
    A a = new A(x, y);
    a.foo();
    a.bar();
    return a.zork();
  }

  private A(X x, Y y) { /* ... */ };
}

এই পদ্ধতি অবজেক্ট প্যাটার্নটি স্মার্টটাক সেরা অনুশীলন প্যাটার্নস , কেন্ট বেক, পৃষ্ঠা 34–37 এ দেওয়া হয়েছে, যেখানে এটি একটি রিফ্যাক্টরিং প্যাটার্নের শেষ ধাপ, শেষ:

  1. আসল পদ্ধতিটিকে এমন একটি দিয়ে প্রতিস্থাপন করুন যা নতুন পদ্ধতির উদাহরণ তৈরি করে, মূল পদ্ধতির পরামিতিগুলি এবং রিসিভার দিয়ে নির্মিত এবং "গণনা" আহ্বান করে।

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

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


0

কখনও কখনও কার্যকর হয় যদি আপনি কখন এবং কখন (এবং কত) কোনও বস্তুর উদাহরণ তৈরি করতে চান তা নিয়ন্ত্রণ করতে চান।

অন্যদের মধ্যে, নিদর্শনগুলিতে ব্যবহৃত:

Singleton pattern
Builder pattern

কোনও প্রাইভেট কনস্ট্রাক্টর কীভাবে অপরিবর্তনীয় বস্তুতে দরকারী? অপরিবর্তনীয়তা একটি বস্তু পরিবর্তন প্রতিরোধ সম্পর্কে নির্মাণের পরে , যখন ব্যক্তিগত কনস্ট্রাকটর প্রতিরোধ চলেছেন সৃষ্টি
নীল ভন বার্থ

0

প্রাইভেট কনস্ট্রাক্টর ব্যবহারের ক্ষেত্রে ডোমেন-চালিত ডিজাইনের মুখোমুখি পাঠযোগ্যতা / রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি করা যেতে পারে। "মাইক্রোসফ্ট। নেট - এন্টারপ্রাইজের আর্কিটেকিং অ্যাপ্লিকেশন, দ্বিতীয় সংস্করণ" থেকে:

var request = new OrderRequest(1234);

উদ্ধৃতি, "এখানে দুটি সমস্যা রয়েছে First প্রথমত, কোডটি দেখার সময়, কেউ কী চলছে তা খুব কমই অনুমান করতে পারে Order অর্ডার রিকোয়েস্টের একটি উদাহরণ তৈরি করা হচ্ছে, তবে কেন এবং কোন ডেটা ব্যবহার করছে? 1234 কি? এটি দ্বিতীয় সমস্যাটির দিকে নিয়ে যায়: আপনি সীমাবদ্ধ প্রসঙ্গের সর্বব্যাপী ভাষা লঙ্ঘন করছেন The ভাষা সম্ভবত এর মতো কিছু বলে: গ্রাহক একটি আদেশের অনুরোধ জারি করতে পারে এবং একটি ক্রয় আইডি নির্দিষ্ট করার অনুমতি দেওয়া হয় that's যদি এটি হয় তবে একটি নতুন অর্ডাররুইকস্ট উদাহরণটি পাওয়ার আরও ভাল উপায় এখানে রয়েছে here : "

var request = OrderRequest.CreateForCustomer(1234);

কোথায়

private OrderRequest() { ... }

public OrderRequest CreateForCustomer (int customerId)
{
    var request = new OrderRequest();
    ...
    return request;
}

আমি এটি প্রতিটি একক শ্রেণীর জন্য সমর্থন করছি না, তবে উপরের ডিডিডি দৃশ্যের জন্য আমি মনে করি যে কোনও নতুন অবজেক্টের সরাসরি সৃষ্টি রোধ করার জন্য এটি সঠিকভাবে বোধ করা যায়।

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