জাভাতে ডিফল্ট অ্যাক্সেস নির্দিষ্টকরণকারী কী?


108

আমি কেবল একটি জাভা বই পড়া শুরু করেছিলাম এবং অবাক হয়েছি; কোন অ্যাক্সেস স্পেসিফায়ার ডিফল্ট, কোনওটি নির্দিষ্ট না হলে?


সঠিক শব্দটি হল 'অ্যাক্সেস মডিফায়ার'। 'স্পেসিফায়ার' শব্দটি জেএলএস-তে উপস্থিত হয় না।
মারকুইস

উত্তর:


116

ডিফল্ট দৃশ্যমানতাটি "প্যাকেজ-ব্যক্তিগত" হিসাবে পরিচিত (যদিও আপনি এটি স্পষ্টভাবে ব্যবহার করতে পারবেন না), যার অর্থ ক্ষেত্রটি একই প্যাকেজের ভিতরে যা ক্ষেত্রের অন্তর্ভুক্ত তা অ্যাক্সেসযোগ্য হবে।

যেমন এমডিএমএ উল্লেখ করেছে, ইন্টারফেস সদস্যদের ক্ষেত্রে এটি সত্য নয়, যার জন্য ডিফল্টটি "পাবলিক"।

দেখুন জাভার অ্যাক্সেস specifiers


25
ভুল - ইন্টারফেস সদস্যদের জন্য সত্য নয়। ডিফল্ট অ্যাক্সেসটি পরে সর্বজনীন
mdma

2
এটি আসলে 'প্যাকেজ প্রাইভেট' হিসাবে পরিচিত। তৃতীয় পক্ষের ওয়েবসাইটগুলি আদর্শিক রেফারেন্স নয়। আপনার কেবল জেএলএসকে উদ্ধৃত করা উচিত।
মারকুইস' '

81

ডিফল্ট নির্দিষ্টকারী প্রসঙ্গে নির্ভর করে।

ক্লাস এবং ইন্টারফেস ঘোষণার জন্য, ডিফল্টটি প্যাকেজটি ব্যক্তিগত। এটি সুরক্ষিত এবং প্রাইভেটের মধ্যে পড়ে, একই প্যাকেজ অ্যাক্সেসে কেবল ক্লাস করার অনুমতি দেয়। (সুরক্ষিত এটি এর মতো, তবে প্যাকেজের বাইরে সাবক্লাসে অ্যাক্সেসের অনুমতি দেয়))

class MyClass   // package private
{
   int field;    // package private field

   void calc() {  // package private method

   }
}

ইন্টারফেস সদস্যদের (ক্ষেত্র এবং পদ্ধতি) জন্য, ডিফল্ট অ্যাক্সেস সর্বজনীন। তবে মনে রাখবেন যে ইন্টারফেসের ঘোষণাটি ব্যক্তিগতভাবে প্যাকেজটিতে ডিফল্ট হয়।

interface MyInterface  // package private
{
   int field1;         // static final public

   void method1();     // public abstract
}

আমাদের যদি তখন ঘোষণা থাকে

public interface MyInterface2 extends MyInterface
{

}

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


1
"প্যাকেজ প্রাইভেট" (কখনও কখনও উত্স হিসাবে লিখিত /* pp */) কেবলমাত্র ডিফল্ট অ্যাক্সেসের জন্য সুবিধাজনক নাম । এটি জেএলএসের নাম নয়।
টম হাটিন -

10
@ টম - এটি সঠিক, জেএলএস "ডিফল্ট অ্যাক্সেস" ব্যবহার করে। আমি লিখতে পারতাম "ডিফল্টটি ডিফল্ট অ্যাক্সেস"। কিন্তু এটি খুব সহায়ক বলে মনে হচ্ছে না!
এমডিএমএ

16

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


9

ডিফল্ট দৃশ্যমানতা (কোনও কীওয়ার্ড নেই) হ'ল প্যাকেজ যার অর্থ এটি একই প্যাকেজে অবস্থিত প্রতিটি শ্রেণীর জন্য উপলব্ধ।

মজাদার দিকের নোটটি হ'ল সুরক্ষিতটি সাবক্লাসগুলির মধ্যে নয় বরং একই প্যাকেজের অন্যান্য শ্রেণিতেও দৃশ্যমানতা সীমাবদ্ধ করে


8

এটি কী জিনিস তা নির্ভর করে।

  • শীর্ষ-স্তরের প্রকারগুলি (যা শ্রেণি, এনম, ইন্টারফেস এবং টীকাগুলির অন্য ধরণের মধ্যে ঘোষিত নয়) ডিফল্টরূপে প্যাকেজ-ব্যক্তিগত । ( জেএলএস §6.6.1 )

  • ক্লাসে, সমস্ত সদস্য (এর অর্থ ক্ষেত্র, পদ্ধতি এবং নেস্টেড ধরণের ঘোষণার অর্থ) এবং নির্মাতারা ডিফল্টরূপে প্যাকেজ-ব্যক্তিগত । ( জেএলএস §6.6.1 )

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

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

  • স্থানীয় ক্লাসগুলিকে একটি পদ্ধতি, কনস্ট্রাক্টর বা আরম্ভকারী ব্লকের ভিতরে ঘোষিত ক্লাসের নাম দেওয়া হয়। তারা হয় করার scoped {.. }ব্লক যা তারা ঘোষণা করা এবং কোন এক্সেস সুনির্দিষ্টভাবে উল্লেখ করা অনুমতি দেয় না। ( জেএলএস -১.3.৩ ) প্রতিচ্ছবি ব্যবহার করে, আপনি অন্য কোথাও থেকে স্থানীয় ক্লাসগুলি ইনস্ট্যান্ট করতে পারেন এবং সেগুলি প্যাকেজ-ব্যক্তিগত , যদিও আমি নিশ্চিত নই যে এই বিবরণটি জেএলএসে আছে কিনা I'm

  • অজ্ঞাতনামা ক্লাসগুলি হ'ল কাস্টম ক্লাস newযা দিয়ে অভিব্যক্তিতে সরাসরি কোনও শ্রেণীর শরীর নির্দিষ্ট করা হয়। ( জেএলএস §15.9.5 ) তাদের সিনট্যাক্সটি কোনও অ্যাক্সেস নির্দিষ্টকারীকে অনুমতি দেয় না। প্রতিবিম্ব ব্যবহার করে, আপনি অন্য কোথাও বেনাম ক্লাসগুলি ইনস্ট্যান্ট করতে পারেন এবং তারা এবং তাদের উত্পন্ন নির্মাতারা উভয়ই প্যাকেজ-ব্যক্তিগত , যদিও আমি নিশ্চিত নই যে এই বিবরণটি জেএলএসে আছে কিনা।

  • উদাহরণস্বরূপ এবং স্ট্যাটিক ইনিশিয়ালাইজার ব্লকগুলির ভাষা স্তরে অ্যাক্সেস স্পেসিফায়ার নেই ( জেএলএস &8.6 এবং 8.7 ), তবে স্ট্যাটিক ইনিশিয়ালাইজার ব্লকগুলি <clinit>( জেভিএমএস §2.9 ) নামে একটি পদ্ধতি হিসাবে প্রয়োগ করা হয় , সুতরাং পদ্ধতিটি অবশ্যই অভ্যন্তরীণভাবে কিছু অ্যাক্সেস স্পেসিফায়ার থাকতে হবে। আমি জাভ্যাক এবং এক্লিপসের সংকলক দ্বারা একটি হেক্স সম্পাদক ব্যবহার করে সংকলিত ক্লাসগুলি পরীক্ষা করে দেখেছি যে উভয়ই প্যাকেজ-প্রাইভেট হিসাবে পদ্ধতিটি উত্পন্ন করে । তবে, আপনি <clinit>()ভাষার মধ্যে কল করতে পারবেন না কারণ একটি পদ্ধতির নাম <এবং >অক্ষরগুলি অবৈধ, এবং প্রতিবিম্বের পদ্ধতিগুলি এর অস্তিত্ব অস্বীকার করার জন্য কঠোরভাবে ব্যবহৃত হয়, তাই কার্যকরভাবে এর অ্যাক্সেস স্পেসিফায়ারের কোনও অ্যাক্সেস নেই । শ্রেণি শুরুর সময় পদ্ধতিটি কেবল ভিএম দ্বারা কল করা যেতে পারে।ইনস্ট্যান্স ইনিশিয়ালাইজার ব্লকগুলি পৃথক পদ্ধতি হিসাবে সংকলিত হয় না; তাদের কোড প্রতিটি নির্মাণকারীর মধ্যে অনুলিপি করা হয়, তাই তারা প্রতিচ্ছবি এমনকি পৃথকভাবে অ্যাক্সেস করা যাবে না।


7

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

  Access Levels
    Modifier    Class   Package Subclass  EveryWhere
    public        Y        Y       Y         Y
    protected     Y        Y       Y         N
    default       Y        Y       N         N
    private       Y        N       N         N

আপনি যদি কোনও ইন্টারফেসে ডিফল্ট ব্যবহার করেন তবে আপনি এই উদাহরণটির মতো কোনও পদ্ধতি প্রয়োগ করতে সক্ষম হবেন

public interface Computer {    
    default void Start() {
        throw new UnsupportedOperationException("Error");
    }    
}

তবে এটি কেবল 8 টি জাভা সংস্করণ থেকে কাজ করবে

অফিসিয়াল ডকুমেন্টেশন

জাভাতে অ্যাক্সেস মডিফায়ারগুলি


3

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


3

ডিফল্ট অ্যাক্সেস স্পেসিফায়ার প্যাকেজ । ক্লাসগুলি একই প্যাকেজে অন্যান্য শ্রেণির সদস্যদের অ্যাক্সেস করতে পারে b তবে প্যাকেজের বাইরে এটি ব্যক্তিগত হিসাবে উপস্থিত হয়


3

জাভার স্রষ্টা জেমস গোসলিংয়ের একটি সাক্ষাত্কার থেকে প্যাকেজ স্তরের দৃশ্যমানতার বিষয়ে একটি উদ্ধৃতি এখানে দেওয়া হয়েছে:

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

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

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

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

তবে বন্ধুদের তালিকা নিজেই এক ধরণের সংস্করণ সমস্যা তৈরি করে। এবং তাই একটি বন্ধুত্বপূর্ণ বর্গ এই ধারণা ছিল। এবং আমি যে সুন্দর জিনিসটি তৈরি করছিলাম সেটি ডিফল্ট - আমি সমস্যার সমাধান করব তাই কীওয়ার্ডটি হওয়া উচিত?

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

http://www.artima.com/intv/gosling2P.html


2

জাভা আপডেট করুন 8default কীওয়ার্ডের ব্যবহার : অন্য অনেকে যেমন উল্লেখ করেছেন ডিফল্ট দৃশ্যমানতা (কোনও কীওয়ার্ড নেই)

বর্গের যে প্যাকেজের অন্তর্গত সেই একই প্যাকেজের ভিতরে থেকে ক্ষেত্রটি অ্যাক্সেসযোগ্য হবে।

নতুন জাভা 8 বৈশিষ্ট্য ( ডিফল্ট পদ্ধতি ) দিয়ে বিভ্রান্ত হওয়ার দরকার নেই যা কোনও ইন্টারফেসটিকে defaultকীওয়ার্ডের সাথে লেবেলযুক্ত করার সময় একটি প্রয়োগকরণ সরবরাহ করতে দেয় ।

দেখুন: অ্যাক্সেস পরিবর্তনকারী


1

জাভাতে "ডিফল্ট" নামে একটি অ্যাক্সেস মডিফায়ার রয়েছে, যা কেবলমাত্র সেই প্যাকেজের মধ্যেই সেই সত্তার সরাসরি উদাহরণ তৈরি করতে দেয়।

এখানে একটি দরকারী লিঙ্ক:

জাভা অ্যাক্সেস মডিফায়ার / স্পেসিফায়ার


-2

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

এটি ন্যায়সঙ্গত করার জন্য একটি উদাহরণ নিন:

public class Simple{  
    public static void main(String args[]){  
     System.out.println("Hello Java");  
    }  
}  

আউটপুট হবে: Hello Java

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


প্রথম বাক্যটি স্পট-অন, তবে যে বাইরের শ্রেণি ব্যক্তিগত হতে পারে না তা প্রমাণ করে না যে জাভায় অ্যাক্সেস স্পেসিফায়ার বলে কোনও জিনিস নেই।
মারকুইস

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

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