জাভাতে কোনও অবজেক্ট তৈরির বিভিন্ন উপায় কী?


178

এই সম্পর্কে অন্য দিন সহকর্মীর সাথে আলাপ হয়েছিল।

একটি কনস্ট্রাক্টর ব্যবহার করার স্পষ্টতই আছে, তবে সেখানে অন্যান্য উপায়গুলি কী?


2
যখন সন্দেহ হয়, তখন ভাষাটি দেখুন। 12.5 নিউ ক্লাস সৃষ্টি দৃষ্টান্ত java.sun.com/docs/books/jls/third_edition/html/... 15.9 ক্লাস ইন্সটান্স ক্রিয়েশন প্রকাশ java.sun.com/docs/books/jls/third_edition/html/...
ইন্টারনেটের ফ্রেন্ড

9
কেবলমাত্র 3 টি রয়েছে: সাধারণ সি-টর (নতুন কীওয়ার্ড), ক্লোন () এবং Unsafe.allocateInstance(Class)। বাকিদের মধ্যে একটি কল। প্রতিবিম্বটি সি-টর কল, অনিরাপদ.অলোক্যাটআইনস্ট্যান্স (শ্রেণি) তে deserialization সংকলিত। আপনি নিজের নিজস্ব এপিআই তৈরি করতে পারেন এবং এর মধ্যে একটির সাথে আপনি কল করতে পারেন।
বেটসেস

2
@ বেসটসেস- Unsafeজাভা সম্পর্কিত একটি প্রয়োগ-নির্দিষ্ট বিবরণ এবং অনুমানের কোথাও উল্লেখ করা হয়নি। এটা একটা অনুবর্তী জাভা বাস্তবায়ন যে কোড যে ব্যবহারসমূহ কম্পাইল প্রতিফলন নিচে ব্যবহার করে না গড়ে তুলতে সম্পূর্ণরূপে সম্ভব new, cloneঅথবা Unsafe.allocateInstance
টেম্পলেট

2
আপনি লিংকটি পরীক্ষা করতে পারেন, কোডস্যান্ডলগিক্স.কম
প্রজ্ঞা

উত্তর:


288

জাভাতে অবজেক্ট তৈরির চারটি ভিন্ন উপায় রয়েছে:

newকীওয়ার্ড ব্যবহার করা
জাভাতে কোনও অবজেক্ট তৈরির এটি সর্বাধিক সাধারণ উপায়। প্রায় 99% অবজেক্ট এইভাবে তৈরি করা হয়।

 MyObject object = new MyObject();

। ব্যবহার Class.forName()
যদি আমরা শ্রেণীর নাম জানি এবং যদি এটিতে সর্বজনীন ডিফল্ট নির্মাতা থাকে তবে আমরা এইভাবে একটি অবজেক্ট তৈরি করতে পারি।

MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();

। ব্যবহার clone()
ক্লোন () একটি বিদ্যমান বস্তুর একটি অনুলিপি তৈরি করতে ব্যবহার করা যাবে।

MyObject anotherObject = new MyObject();
MyObject object = (MyObject) anotherObject.clone();

ডিobject deserialization
অবজেক্ট ডিসরিয়ালাইজেশন ব্যবহার করা এর সিরিয়ালাইজড ফর্মটি থেকে কোনও অবজেক্ট তৈরি করা ছাড়া কিছুই নয়।

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();

আপনি এখান থেকে পড়তে পারেন ।


10
সুতরাং প্রকৃতপক্ষে কেবলমাত্র দুটি উপায় রয়েছে: কলিং কনস্ট্রাক্টর (নতুন, ক্লোন () বা প্রতিবিম্ব ব্যবহার করে) এবং ডিস্ট্রিয়ালাইজেশন যা কনস্ট্রাক্টরকে ডাকে না।
অ্যালেক্সআর

13
@ অ্যালেক্সার: কনস্ট্রাক্টরকেও Object.clone()ডাকে না।
axtavt

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

ডিসরিয়ালাইজেশন কেবলমাত্র সবচেয়ে উত্সযুক্ত ধরণের নয়, একটি নির্মাণকারীকে আহ্বান জানায়।
টম হাটিন -

2
আপনার ক্লাসটিও উল্লেখ করা উচিত Constructor, যা সাধারণীকরণ করে Class.newInstance
টেম্পলেটটিফাইফ

68

বিভিন্ন উপায় আছে:

  • মাধ্যমে Class.newInstance
  • মাধ্যমে Constructor.newInstance
  • ডিসরিয়ালাইজেশন মাধ্যমে (সর্বাধিক উত্স প্রাপ্ত নন-সিরিয়ালযোগ্য বেস শ্রেণীর নো-আরগস কনস্ট্রাক্টর ব্যবহার করে)।
  • মাধ্যমে Object.clone( কোন কনস্ট্রাক্টরকে কল করে না )।
  • জেএনআইয়ের মাধ্যমে (কোনও কনস্ট্রাক্টরকে কল করা উচিত)।
  • অন্য যে কোনও পদ্ধতির মাধ্যমে যা আপনাকে কল করে new
  • আমার ধারণা আপনি শ্রেণি লোডিংকে নতুন অবজেক্ট তৈরি করার মতো বর্ণনা করতে পারেন (যেমন ইন্টার্নযুক্ত String)।
  • একটি প্রজ্ঞাপনে আরশির অংশ হিসাবে একটি আক্ষরিক অ্যারে (অ্যারেগুলির জন্য কোনও নির্মাণকারী নয়)।
  • একটি "varargs" এ অ্যারে (... ) পদ্ধতি কলটিতে অ্যারে (অ্যারেগুলির জন্য কোনও নির্মাণকারী নয়)।
  • সংকলনহীন সময় ধ্রুব স্ট্রিং সংক্ষেপণ (একটি সাধারণ বাস্তবায়নে কমপক্ষে চারটি বস্তু উত্পাদন করতে ঘটে)।
  • রানটাইম দ্বারা তৈরি এবং নিক্ষেপ করার ব্যতিক্রম ঘটায়। উদাহরণস্বরূপ throw null;বা "".toCharArray()[0]
  • ওহ, এবং আদিমদের বক্সিং (অবশ্যই ক্যাশে না হওয়া)।
  • জেডিকে 8 এর ল্যাম্বডাস থাকতে হবে (মূলত সংক্ষিপ্ত বেনামে অভ্যন্তরীণ শ্রেণি), যা স্পষ্টভাবে বস্তুতে রূপান্তরিত হয়।
  • সম্পূর্ণতার জন্য (এবং পাওলো ইবারম্যান) newকীওয়ার্ডের সাথে কিছু বাক্য গঠন রয়েছে ।

6
আপনার "স্বাভাবিক উপায় "
টিও যুক্ত করা

@ পাওলো ইবারম্যান এটি এত পুরানো স্কুল এবং অসাধারণ। (আমি ধরে নিয়েছি যে "কনস্ট্রাক্টর ব্যবহারের দ্বারা এই প্রশ্নের অর্থ কী (যদিও
উপরেরগুলির মধ্যে বেশিরভাগই

এটি করার 3 টি আসল উপায় রয়েছে, যার জন্য আমি মন্তব্য যুক্ত করেছি
বেটসেস

3
আপনি এক মিস: java.misc.Unsafe.allocateInstance()। যদিও এটি বেশ কয়েকটি কারণে বাজে। এবং প্রকৃতপক্ষে, ডিসরিয়ালাইজেশন নো-আরগস কনস্ট্রাক্টর ব্যবহার করে না। হুডের নীচে এটি allocateInstanceকালো যাদু ব্যবহার করে বা সমতুল্য করে।
স্টিফেন সি

এখনও সেরা উত্তর, কিন্তু জেএনআই AllocObject().কোনও নির্মাণকারীকে কল করে না।
মার্কুইস

25

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


1
ত্রুটিপূর্ণ. ডেসেরিয়ালজিটিও কোনও শ্রেণীর নির্মাতাকে স্পষ্টভাবে বা স্পষ্টভাবে কল করে না।
মারকুইস

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

1
ডিফল্ট ক্লোন বাস্তবায়ন কোনও নির্মাণকারীকে কল করে না।
দিদিয়ের এল

এটি যদি আমার ক্লোন পদ্ধতি বাস্তবায়ন হয় তবে "রিটার্ন সুপারক্লোন ();"। তারপরে এটি কনস্ট্রাক্টরকে অনুরোধ করবে না।
মতিন

13

হ্যাঁ, আপনি প্রতিবিম্ব ব্যবহার করে অবজেক্ট তৈরি করতে পারেন। উদাহরণস্বরূপ, String.class.newInstance()আপনাকে একটি নতুন খালি স্ট্রিং অবজেক্ট দেবে।


1
যদি আমি এটি ব্যবহার করি তবে এটি আমাকে চেষ্টা / ক্যাচ ব্লকে আবদ্ধ করতে বলছে।
গুরুকুল্কি

2
হ্যাঁ, এমন অনেকগুলি মামলা রয়েছে যেখানে ব্যতিক্রম ছোঁড়া যায়। কী ভুল হতে পারে তার উদাহরণের জন্য নতুন ইনস্টান্স () এর জন্য জাভাডোক দেখুন।
টমাস ল্যাটার

11

জাভাতে কোনও অবজেক্ট তৈরির জন্য পাঁচটি ভিন্ন উপায় রয়েছে,

1. newকীওয়ার্ড ব্যবহার করে ruct কনস্ট্রাক্টর কল করা হবে

Employee emp1 = new Employee();

২.newInstance()Class কনস্ট্রাক্টরের পদ্ধতি ব্যবহার করে কল করা হবে

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                                .newInstance();

এটি হিসাবে লেখা যেতে পারে

Employee emp2 = Employee.class.newInstance();

৩.newInstance()Constructor কনস্ট্রাক্টরের পদ্ধতি ব্যবহার করে কল করা হবে get

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

৪. clone()পদ্ধতি ব্যবহার করা → কোনও কনস্ট্রাক্টর কল নেই

Employee emp4 = (Employee) emp3.clone();

5. deserialization ization কোন কনস্ট্রাক্টর কল ব্যবহার করে

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

প্রথম তিনটি পদ্ধতি new কীওয়ার্ড এবং উভয়ই newInstance()কনস্ট্রাক্টর কল অন্তর্ভুক্ত করে কিন্তু পরে দুটি ক্লোন এবং ডিসরিয়ালাইজেশন পদ্ধতি কনস্ট্রাক্টরকে কল না করেই বস্তু তৈরি করে।

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

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


দয়া করে কোনও অনুমোদিতকরণ প্রকাশ করুন এবং পোস্টের মাধ্যমে আপনার সাইটের প্রচারের উপায় হিসাবে সাইটটি ব্যবহার করবেন না। আমি কিভাবে একটি ভাল উত্তর লিখতে হবে দেখুন ?
Yvette



6

আপনি জাভাতে নতুন হলে এটি লক্ষ্য করা উচিত, প্রতিটি বস্তু অবজেক্ট থেকে উত্তরাধিকার সূত্রে পেয়েছে

সুরক্ষিত নেটিজ অবজেক্ট ক্লোন () ক্লোননটসপোর্টড এক্সসেপশন ছুড়ে ফেলে;


@ স্ট্যাকার: আপনি কি দয়া করে ব্যাখ্যা করতে পারেন এটি কীভাবে একটি নতুন অবজেক্ট তৈরির সাথে সম্পর্কিত? ধন্যবাদ।
রায়প্রেমোগো

4
@ryanprayogo ক্লোন () একটি নতুন অবজেক্ট ফিরিয়ে দেবে (যদিও বস্তুটি ক্লোন () নামে ডাকা হয়েছিল এমন বস্তুর ক্লোন হলেও) এবং কনস্ট্রাক্টরকে ডাকা না করেই আসলে কোনও নতুন অবজেক্ট তৈরির একমাত্র উপায়।
থমাস ল্যাটজার

6

এছাড়াও, আপনি কোনও বস্তুতে ডেটা সিরিয়ালাইজ করতে পারেন । এটি ক্লাস কনস্ট্রাক্টর দিয়ে যায় না!


আপডেট করা : আপনার মন্তব্যে এটি নির্দেশ করার জন্য টমকে ধন্যবাদ! এবং মাইকেল পরীক্ষাও করেছিলেন।

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

সমস্ত ক্ষেত্রে সম্পূর্ণ চিকিত্সার জন্য দয়া করে টমের উত্তর দেখুন ;-)
জাভাতে "নতুন" কীওয়ার্ড ব্যবহার না করে কোনও অবজেক্ট তৈরির অন্য কোনও উপায় আছে কি?


1
এটি কোনও কনস্ট্রাক্টর দিয়ে যায় (সর্বাধিক উত্স প্রাপ্ত নন-সিরিয়ালাইজড সুপারক্লাসের নো-আরগ কনস্ট্রাক্টর)।
টম হাটিন -

1
@ টম ওহ বাহ - আমি এটি জানতাম না এবং কিছুটা পরীক্ষা-নিরীক্ষা করেছি। স্পষ্টতই যখন সর্বাধিক উত্সযুক্ত অ-সিরিয়ালাইজযোগ্য সুপারক্লাসে কোনও নো-আরগ্স কনস্ট্রাক্টর না থাকে, ফলস্বরূপ একটি অযৌক্তিক শ্রেণিভঙ্গিটি স্রোতে সিরিয়ালীকৃত হয় এবং ডিসিরিয়ালেসনের উপর ফেলে দেওয়া হয় !! - এ কেমন উদ্ভট?
মাইকেল বার্গওয়ার্ড

6

এখানে এক ধরণের অবজেক্ট রয়েছে, যা সাধারণ ইনস্ট্যান্স মেকানিজম (বিল্ডিং কনস্ট্রাক্টর) দ্বারা তৈরি করা যায় না: অ্যারে । অ্যারে দিয়ে তৈরি করা হয়

 A[] array = new A[len];

অথবা

 A[] array = new A[] { value0, value1, value2 };

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

একটি ভারার্গস-পদ্ধতিতে যুক্তিগুলি পাস করার সময়, একটি অ্যারে সেখানেও অন্তর্নিহিতভাবে তৈরি করা হয় (এবং ভরাট)।

চতুর্থ উপায় হবে

 A[] array = (A[]) Array.newInstance(A.class, len);

অবশ্যই, এখানে ক্লোনিং এবং ডিসরিওলাইজও কাজ করে।

স্ট্যান্ডার্ড এপিআইতে এমন অনেকগুলি পদ্ধতি রয়েছে যা অ্যারে তৈরি করে তবে বাস্তবে তারা সকলেই এই উপায়গুলির মধ্যে একটি (বা আরও) ব্যবহার করে।


মঞ্জুর, আপনি অ্যারে কনস্ট্রাক্টরগুলি সংজ্ঞায়িত করতে পারবেন না, তবে এগুলি বাদ দিয়ে একই পদ্ধতিটি মূল newকীওয়ার্ড। অ্যারে.নিউইনস্ট্যান্সই এখানে একমাত্র নতুন প্রক্রিয়া
সান প্যাট্রিক ফ্লয়েড

@ শীন: এটি একই কীওয়ার্ড, তবে এটি একেবারে ভিন্ন অভ্যন্তরীণ প্রক্রিয়া, আমি বলতে সাহস করি।
পাওলো ইবারম্যান

অবশ্যই এটি সত্য। কিন্তু অন্যদিকে অ্যারে তৈরির বিভিন্ন সংস্করণ অভ্যন্তরীণভাবে বেশ একই রকম। শুধু উপলব্ধি আপনার উত্তর পুরাতন স্টাফ আপ মন্থন জন্য 2011 দুঃখিত থেকে :-)
শন প্যাট্রিক ফ্লয়েড

@ শিয়ান: কোনও সমস্যা নেই, আমি কিছু ব্যাকরণ ঠিক করার জন্য এই উপলক্ষটি ব্যবহার করেছি।
পাওলো ইবারম্যান

সুন্দর কাজ, অ্যারে সম্পর্কে কেউ এখানে আলোচনা করেনি!
মতিন

5

আমরা যদি ক্লান্তিকর হয়ে থাকি তবে অন্যান্য উপায়।

  • ওরাকলটিতে জেভিএম হ'ল অনিরাপদ.এলোকোটআইনস্ট্যান্স () যা কনস্ট্রাক্টরকে ফোন না করেই একটি দৃষ্টান্ত তৈরি করে।
  • ব্যবহার বাইট কোড ম্যানিপুলেশন আপনাকে কোড যোগ করতে পারেন anewarray, multianewarray, newarrayবা new। এএসএম বা বিসিইএল এর মতো লাইব্রেরি ব্যবহার করে এগুলি যুক্ত করা যেতে পারে। ওরাকলের জাভা দিয়ে বেলসের একটি সংস্করণ পাঠানো হয়েছে। আবার এটি কোনও কনস্ট্রাক্টরকে কল করে না, তবে আপনি কোনও পৃথক কল হিসাবে কোনও কনস্ট্রাক্টরকে কল করতে পারেন।


4

প্রতিচ্ছবি আপনার জন্য কাজটিও করবে।

SomeClass anObj = SomeClass.class.newInstance();

শ্রেণীর একটি নতুন উদাহরণ তৈরির অন্য উপায়। এই ক্ষেত্রে, আপনাকে ফেলে দেওয়া হতে পারে এমন ব্যতিক্রমগুলিও পরিচালনা করতে হবে।


4
  • newঅপারেটরটি ব্যবহার করে (এভাবে কোনও কনস্ট্রাক্টরকে অনুরোধ করা হচ্ছে)
  • প্রতিবিম্ব ব্যবহার করে clazz.newInstance()(যা আবার নির্মাণকারীকে অনুরোধ করে)। অথবা clazz.getConstructor(..).newInstance(..)(আবার কোনও কনস্ট্রাক্টর ব্যবহার করে তবে আপনি কোনটি বেছে নিতে পারেন)

উত্তরটির সংক্ষিপ্তসার হিসাবে - একটি প্রধান উপায় - অবজেক্টের শ্রেণীর নির্মাতাকে অনুরোধ করে।

আপডেট: অন্য উত্তরটিতে দুটি উপায় তালিকাভুক্ত করা হয়েছে যা নির্মাণকারীর ব্যবহারের সাথে জড়িত নয় - বিকৃতকরণ এবং ক্লোনিং।


4

জাভাতে অবজেক্ট তৈরির জন্য পাঁচটি বিভিন্ন উপায় রয়েছে:

1. নতুন শব্দটি ব্যবহার করে:

এটি জাভাতে কোনও অবজেক্ট তৈরির সর্বাধিক সাধারণ উপায়। প্রায় 99% অবজেক্ট এইভাবে তৈরি করা হয়।

MyObject object = new MyObject();//normal way

2. কারখানার পদ্ধতি ব্যবহার করে:

ClassName ObgRef=ClassName.FactoryMethod();

উদাহরণ:

RunTime rt=Runtime.getRunTime();//Static Factory Method

ক্লোনিং ধারণাটি ব্যবহার করে:

ব্যবহার করে clone(), clone()বিদ্যমান বস্তুর অনুলিপি তৈরি করতে ব্যবহার করা যেতে পারে।

MyObjectName anotherObject = new MyObjectName();
MyObjectName object = anotherObjectName.clone();//cloning Object

৪. `Class.forName ()` ব্যবহার করে:

আমরা যদি ক্লাসের নাম জানি এবং যদি এর সর্বজনীন ডিফল্ট কনস্ট্রাক্টর থাকে তবে আমরা এইভাবে একটি অবজেক্ট তৈরি করতে পারি।

MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance();

উদাহরণ:

String st=(String)Class.forName("java.lang.String").newInstance();

৫. অবজেক্টের ডিসেরায়ালাইজেশন ব্যবহার করা:

অবজেক্টের ডিসিরিয়ালাইজেশন এর সিরিয়ালাইজড ফর্মটি থেকে কোনও অবজেক্ট তৈরি করা ছাড়া কিছুই নয়।

ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream );
MyObjectName object = (MyObjectNmae) inStream.readObject();

(4) কেবলমাত্র Class.forName()আপনার যদি ইতিমধ্যে ক্লাস না থাকে তবে অন্য সমস্ত ক্ষেত্রে আপনি যা করেন তা প্রয়োজন। এটির জন্য কোনও নো-আরগস কনস্ট্রাক্টরেরও প্রয়োজন নেই: আপনি যদি সঠিক যুক্তিগুলি জানেন তবে কোনও পাবলিক কনস্ট্রাক্টরকে কল করার উপায় রয়েছে। এবং আপনি কমপক্ষে আরও দুটি উপায় বাদ দিয়েছেন।
লার্নের মারকুইস

2
(2) কারখানা পদ্ধতি অবজেক্টগুলি পাওয়ার জন্য কেবল একটি নিদর্শন। তবে অভ্যন্তরীণভাবে এটি অবজেক্ট তৈরির জন্য "নতুন" কীওয়ার্ড ব্যবহার করে।
কার্তিক বোস

মানুষ কেন এত লোক বলছে যে কারখানা পদ্ধতি অবজেক্ট তৈরি করে, আপনি ছেলেরা কোথা থেকে এগুলি শিখলেন?
মতিন

3

আপনি বিদ্যমান অবজেক্টটিকে ক্লোনও করতে পারেন (এটি যদি ক্লোনেবেল প্রয়োগ করে)।

Foo fooClone = fooOriginal.clone (); 

2

পদ্ধতি 1

নতুন কীওয়ার্ড ব্যবহার করা। এটি জাভাতে কোনও অবজেক্ট তৈরির সর্বাধিক সাধারণ উপায়। প্রায় 99% অবজেক্ট এইভাবে তৈরি করা হয়।

Employee object = new Employee();

পদ্ধতি 2

Class.forName () ব্যবহার করে। Class.forName () আপনাকে ক্লাস অবজেক্ট দেয় যা প্রতিবিম্বের জন্য কার্যকর। এই বস্তুটি যে পদ্ধতিগুলি করেছে তা জাভা দ্বারা সংজ্ঞায়িত করা হয়েছে, ক্লাস লেখার দ্বারা প্রোগ্রামার দ্বারা নয়। তারা প্রতিটি শ্রেণীর জন্য একই। এর উপর NewInstance () কল করা আপনাকে সেই শ্রেণীর উদাহরণ দেয় (যেমন কলিংক্লাস.ফর্মনেম ("উদাহরণস্লাস")। newInstance () এটি নতুন উদাহরণক্লাস ()) কল করার সমতুল্য, যার উপর আপনি ক্লাসটি সংজ্ঞায়িত পদ্ধতিগুলি কল করতে পারেন, দৃশ্যমান ক্ষেত্র ইত্যাদি অ্যাক্সেস করুন

Employee object2 = (Employee) Class.forName(NewEmployee).newInstance();

Class.forName () সর্বদা কলারের ক্লাসলোডার ব্যবহার করবে, যেখানে ClassLoader.loadClass () একটি আলাদা ClassLoader নির্দিষ্ট করতে পারে। আমি বিশ্বাস করি যে Class.forName লোডড ক্লাসটিও আরম্ভ করে, যদিও ClassLoader.loadClass () পদ্ধতিটি এখনই তা করে না (এটি প্রথমবার ব্যবহার না হওয়া পর্যন্ত এটি আরম্ভ করা হয়নি)।

অন্য একটি পড়তে হবে:

জাভা: সরল জাভা এনাম উদাহরণ সহ থ্রেড স্টেটের ভূমিকা

পদ্ধতি 3

ক্লোন () ব্যবহার করে। ক্লোন () একটি বিদ্যমান অবজেক্টের অনুলিপি তৈরি করতে ব্যবহার করা যেতে পারে।

Employee secondObject = new Employee();
Employee object3 = (Employee) secondObject.clone();

পদ্ধতি 4

NewInstance () পদ্ধতি ব্যবহার করে

Object object4 = Employee.class.getClassLoader().loadClass(NewEmployee).newInstance();

পদ্ধতি 5

অবজেক্ট ডিসারিয়ালাইজেশন ব্যবহার করা। অবজেক্ট ডিসরিয়ালাইজেশন এর সিরিয়ালাইজড ফর্ম থেকে কোনও অবজেক্ট তৈরি করা ছাড়া কিছুই নয়

// Create Object5
// create a new file with an ObjectOutputStream
FileOutputStream out = new FileOutputStream("");
ObjectOutputStream oout = new ObjectOutputStream(out);

// write something in the file
oout.writeObject(object3);
oout.flush();

// create an ObjectInputStream for the file we created before
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("crunchify.txt"));
Employee object5 = (Employee) ois.readObject();

কোড নয় এমন পাঠ্যের জন্য কোড বিন্যাস ব্যবহার করবেন না। এর চেয়ে আরও বেশি পদ্ধতি রয়েছে। অন্যান্য উত্তর পড়ুন। 'প্রায় 99%' কেবল অনুমান করা।
মারকুইস

হাই ইজেপি এই ভুলের জন্য দুঃখিত ... আমি বলেছিলাম যে এটি এক ধরণের জিনিস যা সঠিকভাবে বলা হয়নি এটি সঠিকভাবে তৈরি হয়েছে just এটি কেবলমাত্র একটি মডেল..আর দুঃখের বিষয় আমি আলেনার এবং স্ট্যাকওভারফ্লোতে নতুন একটি
অন্ধ্রিয়া

0

একটি এপিআই ব্যবহারকারীর দৃষ্টিকোণ থেকে, কনস্ট্রাক্টরের অন্য বিকল্প হ'ল স্থির কারখানার পদ্ধতিগুলি (বিগআইন্টেজার.ভেলুওফ ()), যদিও এপিআই লেখকের (এবং প্রযুক্তিগতভাবে "বাস্তবের জন্য") এখনও কনস্ট্রাক্টর ব্যবহার করে অবজেক্ট তৈরি করা হয়।


-1

আপনি তৈরি করে যা বোঝাতে চেয়েছেন তা ঠিক নির্ভর করে তবে কিছু অন্যান্য হ'ল:

  • ক্লোন পদ্ধতি
  • Deserialization
  • প্রতিচ্ছবি (Class.newInstance ())
  • প্রতিবিম্ব (কনস্ট্রাক্টর অবজেক্ট)

2
3 এবং 4 হ'ল একই প্রক্রিয়াটির পৃথক উপকরণ
সান প্যাট্রিক ফ্লয়েড

-2

এখানে ClassLoader.loadClass (স্ট্রিং) রয়েছে তবে এটি প্রায়শই ব্যবহৃত হয় না।

এবং যদি আপনি এটি সম্পর্কে মোট আইনজীবী হতে চান, অ্যারে প্রযুক্তিগতভাবে অ্যারের। দৈর্ঘ্যের সম্পত্তি হ'ল। সুতরাং একটি অ্যারের সূচনা একটি বস্তু তৈরি করে।


1
লোডক্লাস (স্ট্রিং নাম) ফলে ক্লাস অবজেক্টটি দেয় যা একটি বস্তু হ্যাঁ কিন্তু সেই শ্রেণীর অবজেক্ট নয়। যদি উদাহরণ দেওয়া হয় তবে এর আগে আমরা জাভা লাইব্রেরিতে এই জাতীয় অসংখ্য উদাহরণ খুঁজে পেতে পারি তবে সেগুলি শ্রেণিবদ্ধ হবে। পরীক্ষা youtu.be/gGGCmrD6Qpw
nanosoft

-3

আমরা একটি উপায়ে 5 উপায়ে তৈরি করতে পারি:

  1. নতুন অপারেটর দ্বারা
  2. প্রতিবিম্ব দ্বারা (যেমন Class.forName () এর পরে Class.newInstance ())
  3. কারখানা পদ্ধতি দ্বারা
  4. ক্লোনিং দ্বারা
  5. প্রতিবিম্ব দ্বারা এপিআই

3
Class.forName () কোনও অবজেক্ট তৈরি করার পরিবর্তে একটি শ্রেণি লোড করে।
লার্নের মারকুইস

প্রতিবিম্ব? অবশ্যই আপনি প্রতিবিম্ব বোঝাতে চাইছেন।
স্টিফেন সি

আপনি কীভাবে কারখানা পদ্ধতি থেকে অবজেক্ট তৈরি করবেন, অভ্যন্তরীণ বাস্তবায়ন আবার নতুন কী শব্দটি ব্যবহার করতে পারে? এবং কেন আপনার প্রতিচ্ছবি দু'বার? আপনি যদি কিছু নমুনা দেন তবে এটি আরও অর্থবহ হবে
ম্যাটেন

-5

আমরা বস্তুটিও এইভাবে তৈরি করতে পারি: -

String s ="Hello";

এটি নিয়ে কেউ আলোচনা করেনি।


এটি আদিম উপাত্তের প্রকার তৈরির উপায়, এটি জাভা "নতুন" কীওয়ার্ডটি ব্যবহার না করার জন্য পর্দার পিছনে সরবরাহ করে এমন একটি নমনীয়তা his এটি নতুন কীওয়ার্ডের মতো।
মাদুসুদনান

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

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