জাভা ভাষায় প্রশংসিত ক্লাস


96

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

আমি এখনই এগুলি নিয়ে আসছি:

  • Object (স্পষ্টতই) এটি হিসাবে, অন্যান্য জিনিসগুলির মধ্যে একটি সুপার বর্গ নেই।
  • String ভাষাটি যেমন + অপারেটরের জন্য বিশেষ সমর্থন করে।
  • Thread যেহেতু এটিতে কোনও বাইটকোড নির্দেশনা নেই যা বাস্তবায়নের "কাঁটাচামচ" করে সত্ত্বেও এটিতে এই যাদুকরী শুরু () পদ্ধতি রয়েছে।

আমি মনে করি এর মতো সমস্ত শ্রেণি জেএলএসে উল্লিখিত অন্য কোনও উপায়ে রয়েছে। আমি ভুল হলে শুধরে.

যাইহোক, এই ধরনের অন্যান্য শ্রেণীর কি আছে? জাভা ভাষায় "গৌরবময় ক্লাস" এর কোনও সম্পূর্ণ তালিকা আছে?


4
জেনেরিক্স প্রায় ফিট, কিন্তু বেশ নয়। তারা একটি সংকলক কৌশল ব্যবহার করে বাস্তবায়ন করা হয়েছে, তবে তারা এক শ্রেণিতে বিচ্ছিন্ন নয়।
বিল করুন

4
এগুলি সব শ্রদ্ধার ধরণ। ;-)
স্টার ব্লু

4
"থ্রেড.স্টার্ট" কি যাদুকরী? অবশ্যই এটি করার জন্য কিছু নেটিভ কোড বলা হয়েছে?
jcoder

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

4
অনুমান অনুসারে, থ্রেড তৈরির একমাত্র উপায় হ'ল থ্রেড শ্রেণি ( java.sun.com/docs/books/jvms/second_edition/html/… ) from অবশ্যই, এটি জেভিএমের সাথে কিছু নেটিভ স্তরের যোগাযোগের উপর নির্ভর করে, তবে আপনি যদি নিজের জেএনআই করেন, তবে আপনি একটি থ্রেড শুরু করতে পারেন, তবে আপনি কী করছেন তা বুঝতে জেভিএমকে পাবেন না (তালা, মেমরি মডেল, ইত্যাদি) )। থ্রেডটি সুবিধাপ্রাপ্ত হয় যে অনুমিতি এটি একটি বিশেষ অধিকার হিসাবে নির্ধারণ করে - থ্রেড শুরু করার একমাত্র উপায়।
ইশাই

উত্তর:


35

বিভিন্ন রকমের উত্তর রয়েছে, তাই আমি ভেবেছিলাম যে এগুলি সব সংগ্রহ করা কার্যকর হবে (এবং কিছু যোগ করুন):

ক্লাস

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

ইন্টারফেস

  • অপরিশোধনযোগ্য - একমাত্র ইন্টারফেস যা লুপের জন্য বর্ধিত ব্যবহার করা যেতে পারে

সম্মানিত উল্লেখগুলি যায়:

  • java.lang.reflect। অ্যারে - শ্রেণি অবজেক্টের দ্বারা নির্ধারিত হিসাবে নতুন অ্যারে তৈরি করা সম্ভব হবে না।
  • টীকাগুলি এগুলি একটি বিশেষ ভাষার বৈশিষ্ট্য যা রানটাইমের সময় একটি ইন্টারফেসের মতো আচরণ করে। আপনি অবশ্যই অন্য অ্যানোটেশন ইন্টারফেসটি সংজ্ঞায়িত করতে পারেননি ঠিক যেমন আপনি অবজেক্টের জন্য কোনও প্রতিস্থাপন সংজ্ঞা দিতে পারবেন না। যাইহোক, আপনি তাদের সমস্ত কার্যকারিতা বাস্তবায়ন করতে পারেন এবং প্রতিবিম্বের পরিবর্তে এগুলি পুনরুদ্ধার করার (এবং পুরো একগুচ্ছ বয়লারপ্লেটের) আরও একটি উপায় থাকতে পারেন। প্রকৃতপক্ষে, টীকা প্রবর্তনের আগে অনেকগুলি এক্সএমএল ভিত্তিক এবং জাভাদোক ট্যাগ ভিত্তিক বাস্তবায়ন ছিল।
  • ClassLoader - এটি অবশ্যই JVM এর সাথে একটি বিশেষাধিকারযুক্ত সম্পর্কযুক্ত কারণ কোনও শ্রেণি লোড করার কোনও ভাষা উপায় নেই যদিও বাইকোড উপায় রয়েছে, সুতরাং এটি সেভাবে অ্যারের মতো। এটিতে জেভিএম আবারও ডাকার বিশেষ সুযোগ পেয়েছে, যদিও এটি বাস্তবায়ন বিশদ।
  • সিরিয়ালাইজযোগ্য - আপনি প্রতিফলনের মাধ্যমে কার্যকারিতাটি বাস্তবায়িত করতে পারেন তবে এটির নিজস্ব সুবিধাযুক্ত কীওয়ার্ড রয়েছে এবং আপনি কিছু পরিস্থিতিতে সিকিউরিটি ম্যানেজারের সাথে ঘনিষ্ঠ হয়ে অনেক সময় ব্যয় করতে পারেন।

দ্রষ্টব্য: আমি জেএনআই সরবরাহকারী তালিকার জিনিসগুলি বাদ দিয়েছি (যেমন আইও) কারণ আপনি যদি ঝুঁকে থাকেন তবে আপনি সর্বদা আপনার নিজের জেএনআই কলটি প্রয়োগ করতে পারেন। তবে সুবিধাভোগী উপায়ে JVM এর সাথে ইন্টারেস্ট করা নেটিভ কলগুলি আলাদা।

অ্যারেগুলি বিতর্কযোগ্য - এগুলি অবজেক্টের উত্তরাধিকারী হয়, একটি বোধগম্য শ্রেণিবদ্ধতা রয়েছে (অবজেক্ট [] স্ট্রিং [] এর একটি সুপারটাইপ), তবে এগুলি একটি ভাষা বৈশিষ্ট্য, নিজস্বভাবে কোনও সংজ্ঞায়িত শ্রেণি নয়।


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

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

@ KK_07k11A0585, সংগ্রহগুলি একটি স্ট্যান্ডার্ড এপিআই যা যে কেউ আলাদাভাবে তৈরি করতে পারে (বাস্তবে বিকল্প বাস্তবায়ন রয়েছে যা আদিমদের চারপাশে তৈরি করা হয়েছে, পাশাপাশি একটি খুব বিখ্যাত গুগল প্রকল্প যা তাদের বাড়িয়ে তোলে)। কেবলমাত্র তারা যা পায় তা হ'ল I এগুলি অবশ্যই জাভা প্রোগ্রামিংয়ের রুটি এবং মাখন, তবে এগুলি কেবল নিয়মিত ক্লাস, কোনও বিশেষ সুযোগ ছাড়াই with
যিশাই

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

4
কি হবে SecurityManager? বা প্রতিবিম্ব বা সিরিয়ালাইজেশন সম্পর্কিত কিছু?
এন্টিমোনি

19

Class, অবশ্যই. এটির নিজস্ব আক্ষরিক (বিটিডব্লিউয়ের সাথে এটি একটি পার্থক্য ভাগ করে নেওয়া String) রয়েছে এবং এটি সমস্ত প্রতিচ্ছবি যাদুতে শুরু করার স্থান point


আহ, ভাল কথা। সুতরাং একটি শ্রেণীর আক্ষরিক উদাহরণ কি? আপনি কি MyClass.class উল্লেখ করছেন?
আইয়ুব

4
@ আইউব: ঠিক নোট আপনার কাছে int.class, char.class, ইত্যাদি আছে
মাইকেল Borgwardt


12
  1. এনাম আপনাকে এটিকে সাবক্লাস করার অনুমতি নেই তবে সংকলক তা করতে পারে।
  2. জাভা.ইটিল.কমারেন্টের অধীনে অনেকগুলি জিনিস জেভিএম সমর্থন ছাড়াই প্রয়োগ করা যেতে পারে, তবে সেগুলি অনেক কম দক্ষ হবে।

4
আপনি বেনামে এনমগুলিকে সাবক্লাস করতে পারেন (যা এনাম মানগুলির জন্য ভিজিটর প্যাটার্ন ইমপ্লের ভিত্তি)। তবে হ্যাঁ, আপনি একটি এনাম ;-) পুরোপুরি সাবক্লাস করতে পারবেন না
থিয়েরি

11

সমস্ত নম্বর শ্রেণীর অটোবক্সিং আকারে কিছুটা যাদু রয়েছে ।


আপনি সেই ক্লাসগুলি বোঝাচ্ছেন যা আদিমগুলি মুড়ে দেয় - যার মধ্যে বুলিয়ান এবং চরিত্রও রয়েছে; তবে বিগইন্টিজারকে বাদ দেয়।
এমরি

4
@ প্রাথমিক: ঠিক, কেবল আদিম মোড়কের ক্লাস। দুর্ভাগ্যক্রমে এটি BigInteger বাদ দেয় না।
টিকটিকি বিল

10

যেহেতু গুরুত্বপূর্ণ ক্লাসগুলির উল্লেখ করা হয়েছিল, তাই আমি কয়েকটি ইন্টারফেস উল্লেখ করব:

Iterableইন্টারফেস (1.5 থেকে) - এটা একটি বস্তু একটি foreach লুপ অংশগ্রহণের অনুমতি দেয়:

Iterable<Foo> iterable = ...;
for (Foo foo : iterable) {

}

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


সত্য, এগুলি যদিও ইন্টারফেস, সুতরাং তাদের জন্য প্রতি "বিশেষ" প্রয়োগের প্রয়োজন নেই। (থ্রোয়েবলের মতো।)
আইওব

সিরিয়ালাইজযোগ্য আসলে বিশেষ বাস্তবায়ন প্রয়োজন। এটি এমন একটি ইন্টারফেস যা আপনার দুটি পদ্ধতির প্রত্যাশা করে (আমি নামগুলি ভুলে যাই ... আমি এটি গুগল করতে পারতাম ...) তবে সেগুলি স্ট্যান্ডার্ড ইন্টারফেস স্কিমে প্রয়োজন বা সংজ্ঞায়িত হয় না।
কর্সিকা

@ গ্লোকোডার: তবে একবার তর্ক করতে পারে যে সিরিয়ালাইজেবলের সমস্ত বিশেষত্ব জাভা ভাষার সাথে প্রাসঙ্গিক নয়, কেবলমাত্র অবজেক্টআউটপুটস্ট্রিম এবং অবজেক্টআইপুট স্ট্রিম প্রয়োগের ক্ষেত্রে।
মাইকেল বর্গওয়ার্ট


4
আমার মনে Comparableহয় না - অভ্যন্তরীণ কোনও অংশে অংশ নেয় না। আপনি একই কার্যকারিতা সহ সহজেই লিখতে NewComparableএবং নতুন করতে পারেনNewArrays.sort(..)
বোজহো

6
  1. থ্রোয়েবল , রানটাইম এক্সেপশন, ত্রুটি সংশোধন ত্রুটি
  2. তথ্যসূত্র WeakReference, SoftReference, PhantomReference
  3. এনাম
  4. টীকা

সুন্দর তালিকা। +1, টীকা যদিও একটি ইন্টারফেস, এবং এর কোন প্রয়োগ নেই।
আইয়ুব

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



2

এই সম্পর্কে নিশ্চিত না। তবে আমি আইও অবজেক্টগুলিকে ম্যানুয়ালি প্রয়োগের কোনও উপায় ভাবতে পারি না।


আপনি ঠিক বলেছেন, এগুলি খাঁটি জাভাতে প্রয়োগ করা যাবে না। এগুলিকে জেএনআইয়ের মাধ্যমে প্রয়োগ করা দরকার (যেমন অন্যান্য ক্লাস যেমন সিস্টেম কল করা প্রয়োজন)। তবে এগুলি ছাড়াও, তাদের সংকলক বা jvm এর কোনও বিশেষ সহায়তার প্রয়োজন নেই।
আইয়ুব

2

Systemক্লাসে কিছু ম্যাজিক আছে ।

System.arraycopy স্থানীয় কোডের মধ্যে একটি হুক ook

public static native void arraycopy(Object array1, int start1, 
  Object array2, int start2, int length);

কিন্তু ...

/**
 * Private version of the arraycopy method used by the jit
 * for reference arraycopies
 */
private static void arraycopy(Object[] A1, int offset1,
  Object[] A2, int offset2, int length) {
   ...
}

4
হেইস তোমার উত্তরের দ্বিতীয় অংশ বলতে কী বোঝ?
পেসারিয়ার

1

ঠিক আছে যেহেতু দৃsert়তার বিশেষ পরিচালনার বিষয়টি উল্লেখ করা হয়েছে। এখানে আরো কিছু ব্যতিক্রম ধরণের রয়েছে যাগুলির jvm দ্বারা বিশেষ চিকিত্সা রয়েছে:

  • নাল পয়েন্টার ব্যতিক্রম
  • গাণিতিক ধারণা।
  • স্ট্যাকওভারফ্লোএক্সেপশন
  • সব ধরণের আউটআফমেমরিইরিজ
  • ...

ব্যতিক্রমগুলি বিশেষ নয়, তবে জেভিএম এগুলিকে বিশেষ ক্ষেত্রে ব্যবহার করে, তাই আপনি নিজের জেভিএম না লিখে নিজে এগুলি প্রয়োগ করতে পারবেন না। আমি নিশ্চিত যে চারপাশে আরও বিশেষ ব্যতিক্রম রয়েছে।


0

এই ক্লাসগুলির বেশিরভাগই সংকলক বা জেভিএমের 'বিশেষ' সহায়তায় বাস্তবায়িত হয়নি isn't অবজেক্ট এমন কিছু নেটিভ রেজিস্ট্রেশন করে যা অভ্যন্তরীণ জেভিএম কাঠামোর চারপাশে ঝাঁকুনি দেয় তবে আপনি এটি নিজের ক্লাসের জন্যও করতে পারেন। (আমি স্বীকার করি এটি শব্দার্থবিজ্ঞানের সাপেক্ষে, "জেভিএম-এ সংজ্ঞায়িত নেটিভ কল করে" বিশেষ জেভিএম সমর্থন হিসাবে বিবেচনা করা যেতে পারে))

'নতুন' এর আচরণ এবং কী কী বিশেষ তা এই অভ্যন্তরীণ কাঠামোগুলি কীভাবে সূচনা করে সে সম্পর্কে "নিক্ষেপ" নির্দেশাবলী।

টীকাগুলি এবং সংখ্যাগুলি বেশ আউট-আউট অদ্ভুত।


4
আইওউব ক্লাসগুলি বোঝায় যে আপনি নিজেকে প্রয়োগ করতে পারবেন না, কারণ তাদের সমর্থনে বিশেষ বিল্ড রয়েছে। Java.lang.Object ফর্ম উত্তরাধিকার সূত্রে আপনি টাইপ সিস্টেমের মূল হিসাবে আপনার নিজস্ব অবজেক্ট শ্রেণি তৈরি করতে পারবেন না। এটি একটি মূল শ্রেণি কিনা তা নিশ্চিত করার জন্য অবজেক্টটির সংকলক এবং jvm উভয়েরই বিশেষ সমর্থন রয়েছে। নেটিভ কলগুলি এগুলি পেতে যথেষ্ট নয় enough
জোসেফেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.