CodeGym /Java Blog /এলোমেলো /জাভা কনস্ট্রাক্টর
John Squirrels
লেভেল 41
San Francisco

জাভা কনস্ট্রাক্টর

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

বিশ্বে কনস্ট্রাক্টর কী এবং কেন তাদের প্রয়োজন?

আসুন দুটি উদাহরণ বিবেচনা করা যাক।

public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

       Car bugatti = new Car();
       bugatti.model = "Bugatti Veyron";
       bugatti.maxSpeed = 378;

   }
}
আমরা আমাদের গাড়ি তৈরি করেছি এবং এর মডেল এবং সর্বোচ্চ গতি সেট করেছি। কিন্তু কার অবজেক্টের একটি বাস্তব প্রকল্পে স্পষ্টতই 2টি ক্ষেত্র থাকবে না। উদাহরণস্বরূপ, এটি 16 ক্ষেত্র থাকতে পারে!

public class Car {

   String model;// model
   int maxSpeed;// maximum speed
   int wheels;// wheel width
   double engineVolume;// engine volume
   String color;// color
   int productionYear;// production year
   String ownerFirstName;// first name of owner
   String ownerLastName;// last name of owner
   long price;// price
   boolean isNew;// flag indicating whether car is new
   int seatsInTheCar;// number of seats in the car
   String cabinMaterial;// interior material
   boolean insurance;// flag indicating whether car is insured
   String manufacturerCountry;// manufacturer country
   int trunkVolume;// size of the trunk
   int accelerationTo100km;// how long it takes to accelerate to 100 km/h (in seconds)


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "blue";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italy";
       bugatti.ownerFirstName = "Amigo";
       bugatti.productionYear = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.seatsInTheCar = 2;
       bugatti.maxSpeed = 378;
       bugatti.model = "Bugatti Veyron";

   }

}
আমরা একটি নতুন কার অবজেক্ট তৈরি করেছি। একটি সমস্যা আছে: আমাদের 16টি ক্ষেত্র আছে, কিন্তু আমরা শুধুমাত্র 12টি শুরু করেছি ! এখন কোডটি দেখুন এবং আমরা যে ক্ষেত্রগুলি ভুলে গেছি তা খুঁজে বের করার চেষ্টা করুন! এত সহজ না, তাই না? এই পরিস্থিতিতে, একজন প্রোগ্রামার সহজেই ভুল করতে পারে এবং কিছু ক্ষেত্র শুরু করতে ব্যর্থ হতে পারে। ফলস্বরূপ, প্রোগ্রামটি ভুল আচরণ করবে:

public class Car {

   String model;// model
   int maxSpeed;// maximum speed
   int wheels;// wheel width
   double engineVolume;// engine volume
   String color;// color
   int productionYear;// production year
   String ownerFirstName;// first name of owner
   String ownerLastName;// last name of owner
   long price;// price
   boolean isNew;// flag indicating whether car is new
   int seatsInTheCar;// number of seats in the car
   String cabinMaterial;// interior material
   boolean insurance;// flag indicating whether car is insured
   String manufacturerCountry;// manufacturer country
   int trunkVolume;// size of the trunk
   int accelerationTo100km;// how long it takes to accelerate to 100 km/h (in seconds)


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "blue";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italy";
       bugatti.ownerFirstName = "Amigo";
       bugatti.productionYear = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.seatsInTheCar = 2;
       bugatti.maxSpeed = 378;
       bugatti.model = "Bugatti Veyron";

       System.out.println("Model: Bugatti Veyron. Engine volume: " + bugatti.engineVolume + ". Trunk volume: " + bugatti.trunkVolume + ". Cabin material: " + bugatti.cabinMaterial +
       ". Wheel width: " + bugatti.wheels + ". Purchased in 2018 by Mr. " + bugatti.ownerLastName);

   }

}
কনসোল আউটপুট: মডেল: Bugatti Veyron. ইঞ্জিন ভলিউম: 6.3। ট্রাঙ্ক ভলিউম: 0. কেবিন উপাদান: নাল। চাকার প্রস্থ: 0. 2018 সালে মিস্টার নাল কিনেছেন আপনার ক্রেতা, যিনি গাড়ির জন্য $2 মিলিয়ন ছেড়ে দিয়েছেন, স্পষ্টতই " মিস্টার নাল " বলা পছন্দ করবেন না! কিন্তু গুরুত্ব সহকারে, নীচের লাইন হল যে আমাদের প্রোগ্রামটি ভুলভাবে একটি বস্তু তৈরি করেছে: 0 এর চাকা প্রস্থের একটি গাড়ি (অর্থাৎ কোন চাকা নেই), একটি অনুপস্থিত ট্রাঙ্ক, একটি অজানা উপাদান দিয়ে তৈরি একটি কেবিন এবং সর্বোপরি, একটি অনির্ধারিত মালিক। . আপনি কেবল কল্পনা করতে পারেন যে প্রোগ্রামটি চলাকালীন কীভাবে এই জাতীয় ভুল "বন্ধ" হতে পারে! এই ধরনের পরিস্থিতি আমাদের কোনো না কোনোভাবে এড়াতে হবে। আমাদের প্রোগ্রাম সীমাবদ্ধ করতে হবে: একটি নতুন গাড়ি তৈরি করার সময়অবজেক্ট, আমরা চাই যে ক্ষেত্রগুলি, যেমন মডেল এবং সর্বোচ্চ গতি, সর্বদা নির্দিষ্ট করা হোক। অন্যথায়, আমরা বস্তুর সৃষ্টি রোধ করতে চাই। কনস্ট্রাক্টররা সহজেই এই কাজটি পরিচালনা করে। তারা একটি কারণে তাদের নাম পেয়েছে। কনস্ট্রাক্টর এক ধরনের ক্লাস "কঙ্কাল" তৈরি করে যা প্রতিটি নতুন বস্তুকে অবশ্যই মেলে। সুবিধার জন্য, আসুন দুটি ক্ষেত্র সহ কার ক্লাসের সহজ সংস্করণে ফিরে যাই । আমাদের প্রয়োজনীয়তা বিবেচনা করে, কার ক্লাসের কনস্ট্রাক্টর দেখতে এইরকম হবে:

public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}

// And creating an object now looks like this:

public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 378);
}
কিভাবে একটি কনস্ট্রাক্টর ঘোষণা করা হয় নোট করুন। এটি একটি নিয়মিত পদ্ধতির অনুরূপ, কিন্তু এটির কোনো রিটার্ন টাইপ নেই। তাছাড়া, কনস্ট্রাক্টর একটি বড় হাতের অক্ষর দিয়ে শুরু করে ক্লাসের নাম ( কার ) নির্দিষ্ট করে। অতিরিক্তভাবে, কনস্ট্রাক্টর একটি কীওয়ার্ডের সাথে ব্যবহার করা হয় যা আপনার জন্য নতুন: এটিএই কীওয়ার্ডটি একটি নির্দিষ্ট বস্তুকে নির্দেশ করার জন্য। কন্সট্রাক্টরের কোড

public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
প্রায় শাব্দিকভাবে ব্যাখ্যা করা যেতে পারে: " এই গাড়ির মডেলটি (এখন আমরা যেটি তৈরি করছি) মডেল আর্গুমেন্টটি কনস্ট্রাক্টরের কাছে পাস করা হয়েছে৷ এই গাড়িটির জন্য maxSpeed ​​(আমরা যেটি তৈরি করছি) হল ম্যাক্সস্পিড আর্গুমেন্টটি কনস্ট্রাক্টর।" এবং এটিই ঘটে:

public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car("Bugatti Veyron", 378);
       System.out.println(bugatti.model);
       System.out.println(bugatti.maxSpeed);
   }

}
কনসোল আউটপুট: Bugatti Veyron 378 কনস্ট্রাক্টর সঠিকভাবে প্রয়োজনীয় মান নির্ধারণ করেছে। আপনি হয়তো লক্ষ্য করেছেন যে একটি কনস্ট্রাক্টর একটি সাধারণ পদ্ধতির মতোই! সুতরাং এটাই. কনস্ট্রাক্টর আসলেই একটি পদ্ধতি, কিন্তু নির্দিষ্ট বৈশিষ্ট্য সহ :) পদ্ধতির মতোই, আমরা আমাদের কনস্ট্রাক্টরের কাছে আর্গুমেন্ট পাস করি। এবং ঠিক একটি পদ্ধতিতে কল করার মতো, একটি কনস্ট্রাক্টরকে কল করা কাজ করবে না যদি না আপনি তাদের নির্দিষ্ট করেন:

public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car(); // Error!
   }
  
}
আপনি দেখতে পারেন যে কনস্ট্রাক্টর আমরা যা অর্জন করার চেষ্টা করছিলাম তা সম্পন্ন করে। এখন আপনি গতি বা মডেল ছাড়া একটি গাড়ি তৈরি করতে পারবেন না! কনস্ট্রাক্টর এবং পদ্ধতির মধ্যে মিল এখানে শেষ হয় না। পদ্ধতির মতই, কনস্ট্রাক্টর ওভারলোড হতে পারে। কল্পনা করুন আপনার বাড়িতে 2টি পোষা বিড়াল আছে। আপনি একটি বিড়ালছানা হিসাবে তাদের একটি পেয়েছিলাম. কিন্তু দ্বিতীয়টি আপনি রাস্তা থেকে নিয়েছিলেন যখন এটি ইতিমধ্যে বড় হয়ে গেছে, এবং আপনি জানেন না যে এটি কত পুরানো। এই ক্ষেত্রে, আমরা চাই যে আমাদের প্রোগ্রাম দুটি ধরণের বিড়াল তৈরি করতে সক্ষম হবে: যাদের নাম এবং বয়স রয়েছে (প্রথম বিড়ালের জন্য), এবং যাদের শুধুমাত্র একটি নাম রয়েছে (দ্বিতীয় বিড়ালের জন্য)। এর জন্য, আমরা কনস্ট্রাক্টরকে ওভারলোড করব:

public class Cat {

   String name;
   int age;

   // For the first cat
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   // For the second cat
   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5);
       Cat streetCatNamedBob = new Cat("Bob");
   }

}
"নাম" এবং "বয়স" পরামিতি সহ মূল কন্সট্রাকটর ছাড়াও, আমরা শুধুমাত্র একটি নাম পরামিতি সহ আরও একটি যুক্ত করেছি। ঠিক একইভাবে আমরা আগের পাঠে পদ্ধতিগুলিকে ওভারলোড করেছি। এখন আমরা উভয় ধরণের বিড়াল তৈরি করতে পারি :)
কেন আমরা কনস্ট্রাক্টর প্রয়োজন?  - 2
মনে রাখবেন যে পাঠের শুরুতে আমরা বলেছিলাম যে আপনি ইতিমধ্যে এটি উপলব্ধি না করেই কনস্ট্রাক্টর ব্যবহার করেছেন? আমরা যা বলেছি তা বোঝাতে চেয়েছিলাম। আসল বিষয়টি হল জাভাতে প্রতিটি ক্লাসকে ডিফল্ট কনস্ট্রাক্টর বলা হয়। এটি কোনো আর্গুমেন্ট নেয় না, কিন্তু আপনি যখনই কোনো ক্লাসের কোনো অবজেক্ট তৈরি করেন তখন এটিকে আহ্বান করা হয়।

public class Cat {

   public static void main(String[] args) {

       Cat smudge = new Cat(); // The default constructor is invoked here
   }
}
প্রথম নজরে, এটি অদৃশ্য। আমরা একটি বস্তু তৈরি করেছি, তাই কি? কন্সট্রাকটর এখানে কিছু করছে কোথায়? এটি দেখতে, আসুন স্পষ্টভাবে ক্যাট শ্রেণীর জন্য একটি খালি কনস্ট্রাক্টর লিখুন। আমরা এর ভিতরে কিছু বাক্যাংশ প্রদর্শন করব। যদি বাক্যাংশটি প্রদর্শিত হয়, তাহলে কনস্ট্রাক্টরকে আহ্বান করা হয়েছিল।

public class Cat {

   public Cat() {
       System.out.println("A cat has been created!");
   }

   public static void main(String[] args) {

       Cat smudge = new Cat(); // The default constructor is invoked here
   }
}
কনসোল আউটপুট: একটি বিড়াল তৈরি করা হয়েছে! নিশ্চিতকরণ আছে! ডিফল্ট কনস্ট্রাক্টর সবসময় আপনার ক্লাসে অদৃশ্যভাবে উপস্থিত থাকে। তবে এ সম্পর্কে আপনার আরও একটি বিষয় জানতে হবে। আপনি আর্গুমেন্ট সহ একটি কনস্ট্রাক্টর তৈরি করার পরে ডিফল্ট কনস্ট্রাক্টর একটি ক্লাস থেকে মুছে ফেলা হয়। আসলে, আমরা ইতিমধ্যে উপরে এর প্রমাণ দেখেছি। এটি এই কোডে ছিল:

public class Cat {

   String name;
   int age;

   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat(); //Error!
   }
}
আমরা নাম এবং বয়স ছাড়া একটি বিড়াল তৈরি করতে পারিনি , কারণ আমরা স্ট্রিং এবং int প্যারামিটার সহ একটি ক্যাট কনস্ট্রাক্টর ঘোষণা করেছি। এর ফলে ডিফল্ট কনস্ট্রাক্টর ক্লাস থেকে অবিলম্বে অদৃশ্য হয়ে যায়। তাই মনে রাখবেন যে যদি আপনার ক্লাসে নো-আর্গুমেন্ট কনস্ট্রাক্টর সহ বেশ কয়েকটি কনস্ট্রাক্টরের প্রয়োজন হয় তবে আপনাকে এটি আলাদাভাবে ঘোষণা করতে হবে। উদাহরণস্বরূপ, ধরুন আমরা একটি ভেটেরিনারি ক্লিনিকের জন্য একটি প্রোগ্রাম তৈরি করছি। আমাদের ক্লিনিক ভাল কাজ করতে এবং গৃহহীন বিড়ালছানাদের সাহায্য করতে চায় যাদের নাম এবং বয়স অজানা। তারপর আমাদের কোড এই মত হওয়া উচিত:

public class Cat {

   String name;
   int age;

   // For cats with owners
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   // For street cats
   public Cat() {
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5);
       Cat streetCat = new Cat();
   }
}
এখন যেহেতু আমরা একটি স্পষ্ট ডিফল্ট কনস্ট্রাক্টর লিখেছি, আমরা উভয় প্রকারের বিড়াল তৈরি করতে পারি :) যেকোনো পদ্ধতির মতো, একটি কনস্ট্রাক্টরের কাছে পাঠানো আর্গুমেন্টের ক্রম খুবই গুরুত্বপূর্ণ। আসুন আমাদের কনস্ট্রাক্টরে নাম এবং বয়সের আর্গুমেন্টগুলি অদলবদল করি।

public class Cat {

   String name;
   int age;

   public Cat(int age, String name) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 10); // Error!
   }
}
একটি ভুল! কনস্ট্রাক্টর স্পষ্টভাবে উল্লেখ করে যে যখন একটি বিড়াল বস্তু তৈরি করা হয়, তখন এই ক্রমে একটি সংখ্যা এবং একটি স্ট্রিং পাস করতে হবে। সুতরাং, আমাদের কোড কাজ করে না. আপনার নিজের ক্লাস ঘোষণা করার সময় এটি মনে রাখবেন এবং এটি মনে রাখবেন:

public Cat(String name, int age) {
   this.name = name;
   this.age = age;
}

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
এই দুটি সম্পূর্ণ ভিন্ন নির্মাণকারী! যদি আমরা একটি একক বাক্যে "কেন আমার একজন কনস্ট্রাক্টর প্রয়োজন?" প্রশ্নের উত্তরটি প্রকাশ করি, আমরা বলতে পারি, "বস্তুগুলির সর্বদা একটি বৈধ অবস্থা রয়েছে তা নিশ্চিত করার জন্য"। আপনি যখন কনস্ট্রাক্টর ব্যবহার করেন, তখন আপনার সমস্ত ভেরিয়েবল সঠিকভাবে শুরু হবে। আপনার প্রোগ্রামগুলিতে 0 এর গতি বা অন্য কোন "অবৈধ" বস্তুর সাথে কোন গাড়ি থাকবে না। তাদের প্রধান সুবিধা হল প্রোগ্রামারদের জন্য। আপনি যদি ক্ষেত্রগুলি ম্যানুয়ালি শুরু করেন (একটি অবজেক্ট তৈরি করার পরে), তাহলে একটি বড় ঝুঁকি রয়েছে যে আপনি কিছু মিস করবেন এবং একটি বাগ প্রবর্তন করবেন। কিন্তু এটি একটি কনস্ট্রাক্টরের সাথে ঘটবে না: আপনি যদি সমস্ত প্রয়োজনীয় আর্গুমেন্ট পাস করতে ব্যর্থ হন বা আপনি ভুল ধরনের আর্গুমেন্ট পাস করেন, কম্পাইলার অবিলম্বে একটি ত্রুটি নিবন্ধন করবে। আমাদের অবশ্যই আলাদাভাবে বলতে হবে যে আপনি আপনার প্রোগ্রামটি রাখবেন না' একটি কনস্ট্রাক্টরের ভিতরের যুক্তি। এই জন্য কি পদ্ধতি. পদ্ধতিগুলি হল যেখানে আপনার সমস্ত প্রয়োজনীয় কার্যকারিতা সংজ্ঞায়িত করা উচিত। আসুন দেখি কেন একটি কনস্ট্রাক্টরে যুক্তি যোগ করা একটি খারাপ ধারণা:

public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Our car factory is called " + this.name);
   System.out.println("It was founded " + this.age + " years ago" );
   System.out.println("Since that time, it has produced " + this.carsCount +  " cars");
   System.out.println("On average, it produces " + (this.carsCount/this.age) + " cars per year");
}

   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Ford", 115 , 50000000);
   }
}
আমাদের একটি কারফ্যাক্টরি ক্লাস রয়েছে যা গাড়ির কারখানার বর্ণনা দেয়। কনস্ট্রাক্টরের ভিতরে, আমরা সমস্ত ক্ষেত্র শুরু করি এবং কিছু যুক্তি অন্তর্ভুক্ত করি: আমরা কারখানা সম্পর্কে কিছু তথ্য প্রদর্শন করি। মনে হচ্ছে এতে খারাপ কিছু নেই। প্রোগ্রাম ভাল কাজ করে. কনসোল আউটপুট: আমাদের গাড়ির কারখানার নাম ফোর্ড এটি 115 বছর আগে প্রতিষ্ঠিত হয়েছিল সেই সময় থেকে, এটি গড়ে 50000000 গাড়ি তৈরি করেছে, এটি প্রতি বছর 434782টি গাড়ি উত্পাদন করে তবে আমরা আসলে একটি সময়-বিলম্বিত মাইন স্থাপন করেছি। এবং এই ধরনের কোড খুব সহজেই ত্রুটি হতে পারে. ধরুন যে এখন আমরা ফোর্ডের কথা বলছি না, "অ্যামিগো মোটরস" নামে একটি নতুন কারখানার কথা বলছি, যা এক বছরেরও কম সময় ধরে বিদ্যমান এবং 1000টি গাড়ি তৈরি করেছে:

public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Our car factor is called " + this.name);
   System.out.println("It was founded " + this.age + " years ago" );
   System.out.println("Since that time, it has produced " + this.carsCount +  " cars");
   System.out.println("On average, it produces " + (this.carsCount/this.age) + " cars per year");
}


   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Amigo Motors", 0 , 1000);
   }
}
কনসোল আউটপুট: থ্রেড "প্রধান" java.lang.ArithmeticException: / by zero এটি 0 বছর আগে প্রতিষ্ঠিত হয়েছিল, সেই সময় থেকে, এটি CarFactory এ 1000টি গাড়ি তৈরি করেছে ৷ (CarFactory.java:15) CarFactory.main (CarFactory.java:23) এ প্রস্থান কোড 1 দিয়ে প্রক্রিয়া শেষ হয়েছে বুম! প্রোগ্রামটি কিছু বোধগম্য ত্রুটির সাথে শেষ হয়। আপনি কারণ অনুমান করার চেষ্টা করতে পারেন? সমস্যাটি যুক্তিতে আমরা কনস্ট্রাক্টরে রাখি। আরো নির্দিষ্টভাবে, এই লাইন:

System.out.println("On average, it produces " + (this.carsCount/this.age) + " cars per year");
এখানে আপনি একটি গণনা করছেন এবং কারখানার বয়স দ্বারা উত্পাদিত গাড়ির সংখ্যা ভাগ করছেন। এবং যেহেতু আমাদের কারখানাটি নতুন (অর্থাৎ এটি 0 বছর পুরানো), আমরা 0 দিয়ে ভাগ করি, যা আমরা গণিতে করতে পারি না। ফলস্বরূপ, প্রোগ্রামটি একটি ত্রুটির সাথে সমাপ্ত হয়।

আমাদের কি করা উচিত ছিল?

সমস্ত যুক্তি একটি পৃথক পদ্ধতিতে রাখুন। আসুন এটিকে printFactoryInfo() বলি । আপনি একটি যুক্তি হিসাবে এটি একটি CarFactory বস্তু পাস করতে পারেন. আপনি সেখানে সমস্ত যুক্তি রাখতে পারেন এবং একই সাথে সম্ভাব্য ত্রুটিগুলি পরিচালনা করতে পারেন (যেমন আমাদের শূন্য বছর জড়িত)। প্রতিটি তার নিজস্ব. বৈধ অবজেক্ট স্টেট সেট করতে কনস্ট্রাক্টর প্রয়োজন। আমাদের ব্যবসায়িক যুক্তির জন্য পদ্ধতি আছে। একটার সাথে আরেকটা মেশাবেন না। আপনি যা শিখেছেন তা শক্তিশালী করার জন্য, আমরা আপনাকে আমাদের জাভা কোর্স থেকে একটি ভিডিও পাঠ দেখার পরামর্শ দিই
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION