আমি যা জোছ ব্লচের বিল্ডার প্যাটার্নের চেয়ে বড় উন্নতি তা তৈরি করেছি। এটি "আরও ভাল" কোনওভাবেই বলা যাবেনা , কেবলমাত্র একটি সুনির্দিষ্ট পরিস্থিতিতে এটি কিছু সুবিধা সরবরাহ করে - সবচেয়ে বড় কারণ এটি বিল্ডারকে তার বিল্ট-বিল্ট শ্রেণি থেকে বিচ্ছিন্ন করে দেয়।
আমি নীচে এই বিকল্পটি পুঙ্খানুপুঙ্খভাবে নথিভুক্ত করেছি, যাকে আমি ব্লাইন্ড বিল্ডার প্যাটার্ন বলি।
ডিজাইনের ধরণ: অন্ধ নির্মাতা
জোশুয়া ব্লচের বিল্ডার প্যাটার্নের বিকল্প হিসাবে (কার্যকর জাভা 2 য় সংস্করণে আইটেম 2), আমি যা "ব্লাইন্ড বিল্ডার প্যাটার্ন" বলি তা তৈরি করেছি, যা ব্লচ বিল্ডারের অনেকগুলি সুবিধা ভাগ করে এবং একক চরিত্রকে বাদ দিয়ে, ঠিক একইভাবে ব্যবহৃত হয়। অন্ধ নির্মাতাদের সুবিধা রয়েছে
- বৃত্তাকার নির্ভরতা দূর করে, তার বেষ্টনকারী শ্রেণি থেকে বিল্ডারকে ডিকোপলিং,
- এনকোলেসিং ক্লাসের সোর্স কোডের আকার (যা আর নেই ) হ্রাস করে এবং
ToBeBuilt
শ্রেণীর বিল্ডার বাড়ানো ছাড়াই বর্ধিত হতে দেয় ।
এই ডকুমেন্টেশনে, আমি ক্লাস-নির্মিত-নির্মিত ToBeBuilt
শ্রেণি হিসাবে উল্লেখ করব ।
ব্লচ বিল্ডার সহ একটি ক্লাস প্রয়োগ করা হয়েছে
একটি ব্লচ নির্মাতা public static class
শ্রেণীর ভিতরে একটি বিল্ড থাকে যা এটি তৈরি করে। একটি উদাহরণ:
পাবলিক ক্লাস ইউজার কনফিগ {
ব্যক্তিগত ফাইনাল স্ট্রিং sName;
বেসরকারী চূড়ান্ত int iAge;
বেসরকারী চূড়ান্ত স্ট্রিং এসএফএলক্লোর;
সর্বজনীন ব্যবহারকারীকনফাইগ
// স্থানান্তর
চেষ্টা করুন
sName = uc_c.sName;
} ধরা (নালপয়েন্টারএক্সপশন আরএক্স) {
নতুন নালপয়েন্টার এক্সেকশন ("uc_c") নিক্ষেপ করুন;
}
iAge = uc_c.iAge;
sFavColor = uc_c.sFavColor;
// এখানে সমস্ত ক্ষেত্রকে ভ্যালিডেট করুন
}
পাবলিক স্ট্রিং টু স্ট্রিং () {
"নাম =" + sName + ", বয়স =" + iAge + ", এসএফএভলক্লার =" + এসএফএলক্লোর;
}
//builder...START
পাবলিক স্ট্যাটিক ক্লাস সিএফজি {
ব্যক্তিগত স্ট্রিং sName;
প্রাইভেট ইন আইএজি;
ব্যক্তিগত স্ট্রিং এসএফএলক্লোর;
পাবলিক সিএফজি (স্ট্রিং s_name) {
sName = s_name;
}
// স্ব-প্রত্যাবর্তনকারী ... START
পাবলিক সিএফজি বয়স (int i_age) {
iAge = i_age;
এটি ফেরত দিন;
}
পাবলিক সিএফজি প্রিয় কলার (স্ট্রিং এস_ রঙ) {
sFavColor = s_color;
এটি ফেরত দিন;
}
// স্ব-প্রত্যাবর্তনকারী ... শেষ END
সর্বজনীন ব্যবহারকারী কনফিগ বিল্ড () {
রিটার্ন (নতুন ইউজার কনফিগ (এটি));
}
}
//builder...END
}
একটি ব্লচ নির্মাতার সাথে একটি ক্লাস ইনস্ট্যান্ট করছে
ইউজারকনফিগ ইউসি = নতুন ইউজারকনফিগ.সিএফজি ("কেরিমিট")। বয়স (50)
ব্লাইন্ড বিল্ডার হিসাবে কার্যকর করা একই শ্রেণি
একজন ব্লাইন্ড বিল্ডারের তিনটি অংশ রয়েছে, যার প্রত্যেকটি পৃথক উত্স-কোড ফাইলে রয়েছে:
ToBeBuilt
বর্গ (এই উদাহরণে: UserConfig
)
- এর "
Fieldable
" ইন্টারফেস
- নির্মাতা
1. তৈরি করা বর্গ
বিল্ট-টু বিল্ট বর্গটি তার Fieldable
ইন্টারফেসটিকে তার একমাত্র নির্মাণকারী প্যারামিটার হিসাবে গ্রহণ করে । নির্মাতা এটি থেকে সমস্ত অভ্যন্তরীণ ক্ষেত্র সেট করে এবং প্রতিটিকে বৈধ করে। সবচেয়ে বড় কথা, এই ToBeBuilt
শ্রেণীর এর নির্মাতার সম্পর্কে কোনও জ্ঞান নেই।
পাবলিক ক্লাস ইউজার কনফিগ {
ব্যক্তিগত ফাইনাল স্ট্রিং sName;
বেসরকারী চূড়ান্ত int iAge;
বেসরকারী চূড়ান্ত স্ট্রিং এসএফএলক্লোর;
সর্বজনীন ব্যবহারকারীকনফিগ (ইউজারকনফিগ_ফিল্ডেবল uc_f) {// রান্নাঘর
// স্থানান্তর
চেষ্টা করুন
sName = uc_f.getName ();
} ধরা (নালপয়েন্টারএক্সপশন আরএক্স) {
নতুন নালপয়েন্টার এক্সেকশন ("uc_f") নিক্ষেপ করুন;
}
iAge = uc_f.getAge ();
এসএফএলক্লোর = uc_f.getFavoriteColor ();
// এখানে সমস্ত ক্ষেত্রকে ভ্যালিডেট করুন
}
পাবলিক স্ট্রিং টু স্ট্রিং () {
"নাম =" + sName + ", বয়স =" + iAge + ", এসএফএভলক্লার =" + এসএফএলক্লোর;
}
}
যেমনটি একজন স্মার্ট মন্তব্যকারী দ্বারা উল্লিখিত হয়েছে (যিনি অনিবার্যভাবে তাদের উত্তরটি মুছে ফেলেছেন), যদি ToBeBuilt
শ্রেণিটিও এর প্রয়োগ করে Fieldable
, তবে এর একমাত্র একমাত্র নির্মাণকারী তার প্রাথমিক এবং অনুলিপি উভয় কনস্ট্রাক্টর হিসাবে ব্যবহার করতে পারে (অসুবিধাটি হ'ল ক্ষেত্রগুলি সর্বদা বৈধ হয়, যদিও এটি পরিচিত যে মূল ক্ষেত্রগুলি ToBeBuilt
বৈধ)।
2. " Fieldable
" ইন্টারফেস
ক্ষেত্রযোগ্য ইন্টারফেস হ'ল ToBeBuilt
শ্রেণি এবং তার নির্মাতার মধ্যে "সেতু" , অবজেক্টটি তৈরির জন্য প্রয়োজনীয় সমস্ত ক্ষেত্রকে সংজ্ঞায়িত করে। এই ইন্টারফেসটি ToBeBuilt
ক্লাস কনস্ট্রাক্টর দ্বারা প্রয়োজনীয় , এবং নির্মাতার দ্বারা প্রয়োগ করা হয়। যেহেতু এই ইন্টারফেসটি নির্মাতা ব্যতীত অন্য ক্লাসগুলি দ্বারা প্রয়োগ করা যেতে পারে, তাই যে কোনও শ্রেণি সহজেই ToBeBuilt
তার নির্মাতাকে ব্যবহার করার জন্য বাধ্য না করে ক্লাসটি ইনস্ট্যান্ট করতে পারে । এটি ToBeBuilt
শ্রেণীর প্রসারকে আরও সহজ করে তোলে যখন তার বিল্ডারকে বাড়ানো পছন্দসই বা প্রয়োজনীয় হয় না।
নীচের অংশে বর্ণিত হিসাবে, আমি এই ইন্টারফেসে ফাংশনগুলি মোটেও নথিভুক্ত করি না।
সর্বজনীন ইন্টারফেস
স্ট্রিং getName ();
int getAge ();
স্ট্রিং getFavoriteColor ();
}
3. নির্মাতা
নির্মাতা Fieldable
ক্লাস প্রয়োগ করে । এটি মোটেও কোনও বৈধতা দেয় না এবং এই সত্যটির উপর জোর দেওয়ার জন্য, এর সমস্ত ক্ষেত্রগুলি সর্বজনীন এবং পরিবর্তনীয়। যদিও এই জনসাধারণের অ্যাক্সেসযোগ্যতা কোনও প্রয়োজন নয়, আমি এটিকে পছন্দ করি এবং এটি প্রস্তাব করি, কারণ এটি পুনরায় প্রয়োগ করে যে ToBeBuilt
নির্মাণকারীর ডাকা না হওয়া পর্যন্ত বৈধতা না ঘটে । এটি গুরুত্বপূর্ণ, কারণ অন্য থ্রেডের দ্বারা বিল্ডারকে আরও চালিত করা সম্ভব হয় , এটি ToBeBuilt
কনস্ট্রাক্টরের কাছে যাওয়ার আগেই । ক্ষেত্রগুলির গ্যারান্টি দেওয়ার একমাত্র উপায় বৈধ - ধরে নেওয়া নির্মাতা কোনওভাবেই তার রাজ্যটিকে "লক" করতে পারবেন না - ToBeBuilt
এটি চূড়ান্ত চেক করার জন্য শ্রেণীর পক্ষে for
অবশেষে, Fieldable
ইন্টারফেসের মতো, আমি এর প্রাপ্তকারীদের কোনও নথি করি না।
পাবলিক ক্লাস ইউজার কনফিগ_সিএফজি ইউজার কনফিগ_ফিল্ডেবল প্রয়োগ করে {
পাবলিক স্ট্রিং sName;
পাবলিক ইন আইএজি;
পাবলিক স্ট্রিং এসএফএলক্লোর;
সর্বজনীন ব্যবহারকারীকনফিগ_সিএফজি (স্ট্রিং এর_নাম) {
sName = s_name;
}
// স্ব-প্রত্যাবর্তনকারী ... START
সর্বজনীন ব্যবহারকারীকনফিগ_সিএফজি বয়স (ইন্টি আই_এজ) {
iAge = i_age;
এটি ফেরত দিন;
}
পাবলিক ইউজার কনফিগ_সিএফজি ফেভারিট কালার (স্ট্রিং s_color) {
sFavColor = s_color;
এটি ফেরত দিন;
}
// স্ব-প্রত্যাবর্তনকারী ... শেষ END
//getters...START
পাবলিক স্ট্রিং getName () {
রিটার্ন sName;
}
পাবলিক ইন্ট getAge () {
রিটার্ন আইএজ;
}
পাবলিক স্ট্রিং get ফেভারিট কালার () {
রিটার্ন এসএফএলক্লোর;
}
//getters...END
সর্বজনীন ব্যবহারকারী কনফিগ বিল্ড () {
রিটার্ন (নতুন ইউজার কনফিগ (এটি));
}
}
ব্লাইন্ড বিল্ডার দিয়ে ক্লাস ইনস্ট্যান্ট করছে
ইউজারকনফিগ uc = নতুন ইউজারকনফিগ_সিএফজি ("কেরমিট")। বয়স (50)
পার্থক্যটি " UserConfig_Cfg
" এর পরিবর্তে " UserConfig.Cfg
"
নোট
অসুবিধা:
- অন্ধ নির্মাতারা তার
ToBeBuilt
শ্রেণীর ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে না ,
- এগুলি আরও ভার্বোজ, কারণ এখন নির্মাতা এবং ইন্টারফেস উভয় ক্ষেত্রেই গেটারগুলি প্রয়োজনীয়।
- একক শ্রেণীর জন্য সমস্ত কিছুই কেবলমাত্র এক জায়গায় নেই ।
ব্লাইন্ড বিল্ডার সংকলন সোজা-এগিয়ে রয়েছে:
ToBeBuilt_Fieldable
ToBeBuilt
ToBeBuilt_Cfg
Fieldable
ইন্টারফেস সম্পূর্ণরূপে ঐচ্ছিক
ToBeBuilt
কয়েকটি প্রয়োজনীয় ক্ষেত্রের সাথে শ্রেণীর জন্য - যেমন এই UserConfig
উদাহরণ বর্গ হিসাবে , নির্মাতা সহজেই হতে পারে
সর্বজনীন ব্যবহারকারী কনফিগ (স্ট্রিং s_ নাম, অন্তর্নিহিত i_age, স্ট্রিং s_favColor) {
এবং সাথে নির্মাতাকে ডেকে আনে
সর্বজনীন ব্যবহারকারী কনফিগ বিল্ড () {
রিটার্ন (নতুন ইউজারকনফিগ (getName (), getAge (), getFoiceiteColor ()));
}
বা এমনকি প্রাপ্তি (বিল্ডারে) পুরোপুরি বাদ দিয়ে:
রিটার্ন (নতুন ইউজারকনফিগ (sName, iAge, sFavoriteColor));
সরাসরি ক্ষেত্রগুলি পার করার মাধ্যমে, ToBeBuilt
শ্রেণিটি Fieldable
ইন্টারফেসের মতোই "অন্ধ" (তার নির্মাতাকে অজানা) is তবে, যে ToBeBuilt
ক্লাসগুলির জন্য এবং "বহুবার বাড়ানো এবং উপ-বর্ধিত" হওয়ার উদ্দেশ্যে করা হয়েছে (যা এই পোস্টের শিরোনামে রয়েছে), যে কোনও ক্ষেত্রে কোনও পরিবর্তন প্রতিটি উপ-শ্রেণিতে, প্রতিটি বিল্ডার এবং ToBeBuilt
কনস্ট্রাক্টরের পরিবর্তনের প্রয়োজন । ক্ষেত্র এবং উপ-শ্রেণীর সংখ্যা বাড়ার সাথে সাথে এটি বজায় রাখা অবৈধ হয়ে ওঠে।
(প্রকৃতপক্ষে, কয়েকটি প্রয়োজনীয় ক্ষেত্রের সাথে, কোনও বিল্ডারকে ব্যবহার করা মোটামুটি অতিরিক্ত পরিমাণে হতে পারে those আগ্রহীদের জন্য, এখানে আমার ব্যক্তিগত লাইব্রেরির কয়েকটি বৃহত্তর ফিল্ডেবল ইন্টারফেসের নমুনা is
সাব-প্যাকেজে মাধ্যমিক ক্লাস
আমি সমস্ত নির্মাতা এবং Fieldable
ক্লাসগুলি, সমস্ত ব্লাইন্ড বিল্ডারদের, তাদের ToBeBuilt
শ্রেণীর উপ-প্যাকেজে রাখতে পছন্দ করি । সাব-প্যাকেজটির নাম সর্বদা " z
" রাখা হয়। এটি এই মাধ্যমিক শ্রেণিকে জাভাডক প্যাকেজ তালিকার বিশৃঙ্খলা থেকে বাধা দেয়। উদাহরণ স্বরূপ
library.class.my.UserConfig
library.class.my.z.UserConfig_Fieldable
library.class.my.z.UserConfig_Cfg
বৈধতা উদাহরণ
উপরে উল্লিখিত হিসাবে, সমস্ত বৈধতা ToBeBuilt
এর নির্মাণকারীর মধ্যে ঘটে । উদাহরণস্বরূপ বৈধকরণ কোড সহ এখানে আবার নির্মাতা রয়েছে:
সর্বজনীন ব্যবহারকারী কনফিগ (ইউজারকনফিগ_ ফিল্ডেবল uc_f) {
// স্থানান্তর
চেষ্টা করুন
sName = uc_f.getName ();
} ধরা (নালপয়েন্টারএক্সপশন আরএক্স) {
নতুন নালপয়েন্টার এক্সেকশন ("uc_f") নিক্ষেপ করুন;
}
iAge = uc_f.getAge ();
এসএফএলক্লোর = uc_f.getFavoriteColor ();
// বৈধতা (নিখরচায় প্রাক-সংকলন করা উচিত ...)
চেষ্টা করুন
যদি (! প্যাটার্ন.কম) ফাইল ("\\ ডাব্লু +")। ম্যাচার (এস নাম)। ম্যাচগুলি ())
নতুন অবৈধআরগমেন্টএক্সেপশন নিক্ষেপ করুন ("uc_f.getName () (\" "+ sName +" not ") খালি নাও থাকতে পারে এবং কেবলমাত্র অক্ষরের অঙ্ক এবং আন্ডারস্কোর থাকতে হবে;");
}
} ধরা (নালপয়েন্টারএক্সপশন আরএক্স) {
নতুন নালপয়েন্টারএক্সসেপশন ("uc_f.getName ()") নিক্ষেপ করুন;
}
যদি (iAge <0)
নতুন অবৈধআরগমেন্টএক্সেপশন ("uc_f.getAge () (" + iAge + ") শূন্যের চেয়ে কম।");
}
চেষ্টা করুন
যদি (! প্যাটার্ন.কম) ফাইল ("(?: লাল | নীল | সবুজ | গরম গোলাপী)") mat ম্যাচার (এসএফএলক্লোর) mat ম্যাচগুলি ())
নতুন অবৈধ অরগমেন্টএক্সেপশন ("uc_f.getF मनগতে রঙিন) (" \ "" + uc_f.getFLiveite Color () + "\") লাল, নীল, সবুজ, বা গরম গোলাপী নয় throw ");
}
} ধরা (নালপয়েন্টারএক্সপশন আরএক্স) {
নতুন নালপয়েন্টারএক্সসেপশন ("uc_f.getF मनঘাটিত কলর ()") নিক্ষেপ করুন;
}
}
ডকুমেন্টিং বিল্ডার
এই বিভাগটি ব্লচ বিল্ডার এবং ব্লাইন্ড বিল্ডার উভয়ের জন্যই প্রযোজ্য। এটি দেখায় যে আমি কীভাবে এই ডিজাইনে ক্লাসগুলি নথিভুক্ত করেছি, সেটারগুলি তৈরি করে (বিল্ডারে) এবং তাদের প্রাপ্তরা ( ToBeBuilt
শ্রেণিতে) সরাসরি একে অপরের সাথে ক্রস-রেফারেন্স করে - একক মাউস-ক্লিক দিয়ে এবং ব্যবহারকারীকে কোথায় না জেনে তা জানতে প্রয়োজন এই ফাংশনগুলি প্রকৃতপক্ষে থাকে - এবং বিকাশকারীকে অযথা কিছু নথিভুক্ত করা ছাড়া।
প্রাপ্তি: ToBeBuilt
কেবলমাত্র ক্লাসে
প্রাপ্তরা কেবল ToBeBuilt
ক্লাসে নথিভুক্ত হয় । উভয় শ্রেণী _Fieldable
এবং
_Cfg
শ্রেণিতে সমতুল্য প্রাপ্তরা উপেক্ষা করা হয়। আমি এগুলি মোটেও নথিভুক্ত করি না।
/ **
<P> ব্যবহারকারীর বয়স </ </ p>
@ রিটার্ন একটি ব্যবহারকারীর বয়সের প্রতিনিধিত্ব করে int
@see ইউজার কনফিগ_সিএফজি # বয়স (পূর্ববর্তী)
@see getName ()
** /
পাবলিক ইন্ট getAge () {
রিটার্ন আইএজ;
}
প্রথমটি @see
তার সেটারের একটি লিঙ্ক, যা বিল্ডার শ্রেণিতে রয়েছে।
সেটটার্স: বিল্ডার-ক্লাসে
সেটার নথিভুক্ত করা যেমন যদি এটা হয় ToBeBuilt
বর্গ , এবং এছাড়াও হিসাবে যদি এটি বৈধতা (যা সত্যিই দ্বারা সম্পন্ন করা হয় না ToBeBuilt
এর কন্সট্রাকটর)। তারকাচিহ্ন (" *
") একটি ভিজ্যুয়াল ক্লু যা ইঙ্গিত করে যে লিঙ্কটির লক্ষ্য অন্য শ্রেণিতে রয়েছে।
/ **
<P> ব্যবহারকারীর বয়স নির্ধারণ করুন </ </ p>
@ পরিমাপিকা i_age শূন্যের চেয়ে কম নাও হতে পারে। {@ কোড ইউজারকনফিগ # getName () getName ()} * সাথে পান।
নিবন্ধন করুন
** /
সর্বজনীন ব্যবহারকারীকনফিগ_সিএফজি বয়স (ইন্টি আই_এজ) {
iAge = i_age;
এটি ফেরত দিন;
}
আরো তথ্য
এগুলি একসাথে রেখে: অন্ধ নির্মাতার সম্পূর্ণ উত্স, সম্পূর্ণ ডকুমেন্টেশন সহ
UserConfig.java
আমদানি java.util.regex.Pattern;
/ **
<P> একজন ব্যবহারকারী সম্পর্কে তথ্য - <আই> [নির্মাতা: ইউজারকনফিগ_সিএফজি] </ i> </P>
<P> সমস্ত ক্ষেত্রের বৈধকরণ এই শ্রেণীর নির্মাণকারীতে ঘটে। তবে প্রতিটি বৈধতার প্রয়োজনীয়তা কেবলমাত্র বিল্ডারের সেটার ফাংশনে ডকুমেন্ট। </ P>
<P> {@ কোড জাভা xbn.z.xmpl.lang.builder.finalv.UserConfig} </P>
** /
পাবলিক ক্লাস ইউজার কনফিগ {
সর্বজনীন স্ট্যাটিক চূড়ান্ত শূন্যস্থানীয় প্রধান (স্ট্রিং [] উপেক্ষা)
ইউজারকনফিগ uc = নতুন ইউজারকনফিগ_সিএফজি ("কেরমিট")। বয়স (50)
System.out.println (UC);
}
ব্যক্তিগত ফাইনাল স্ট্রিং sName;
বেসরকারী চূড়ান্ত int iAge;
বেসরকারী চূড়ান্ত স্ট্রিং এসএফএলক্লোর;
/ **
<P> একটি নতুন উদাহরণ তৈরি করুন। এটি সমস্ত ক্ষেত্র সেট করে এবং বৈধ করে। </ P>
@param uc_f {@ কোড নাল not নাও হতে পারে}
** /
সর্বজনীন ব্যবহারকারী কনফিগ (ইউজারকনফিগ_ ফিল্ডেবল uc_f) {
// স্থানান্তর
চেষ্টা করুন
sName = uc_f.getName ();
} ধরা (নালপয়েন্টারএক্সপশন আরএক্স) {
নতুন নালপয়েন্টার এক্সেকশন ("uc_f") নিক্ষেপ করুন;
}
iAge = uc_f.getAge ();
এসএফএলক্লোর = uc_f.getFavoriteColor ();
// বৈধকরণ
চেষ্টা করুন
যদি (! প্যাটার্ন.কম) ফাইল ("\\ ডাব্লু +")। ম্যাচার (এস নাম)। ম্যাচগুলি ())
নতুন অবৈধআরগমেন্টএক্সেপশন নিক্ষেপ করুন ("uc_f.getName () (\" "+ sName +" not ") খালি নাও থাকতে পারে এবং কেবলমাত্র অক্ষরের অঙ্ক এবং আন্ডারস্কোর থাকতে হবে;");
}
} ধরা (নালপয়েন্টারএক্সপশন আরএক্স) {
নতুন নালপয়েন্টারএক্সসেপশন ("uc_f.getName ()") নিক্ষেপ করুন;
}
যদি (iAge <0)
নতুন অবৈধআরগমেন্টএক্সেপশন ("uc_f.getAge () (" + iAge + ") শূন্যের চেয়ে কম।");
}
চেষ্টা করুন
যদি (! প্যাটার্ন.কম) ফাইল ("(?: লাল | নীল | সবুজ | গরম গোলাপী)") mat ম্যাচার (এসএফএলক্লোর) mat ম্যাচগুলি ())
নতুন অবৈধ অরগমেন্টএক্সেপশন ("uc_f.getF मनগতে রঙিন) (" \ "" + uc_f.getFLiveite Color () + "\") লাল, নীল, সবুজ, বা গরম গোলাপী নয় throw ");
}
} ধরা (নালপয়েন্টারএক্সপশন আরএক্স) {
নতুন নালপয়েন্টারএক্সসেপশন ("uc_f.getF मनঘাটিত কলর ()") নিক্ষেপ করুন;
}
}
//getters...START
/ **
<P> ব্যবহারকারীর নাম </ </ p>
@ রিটার্ন এ অ - code @ কোড নাল}, খালি নয় স্ট্রিং।
@see ইউজারকনফিগ_সিএফজি # ইউজারকনফিগ_সিএফজি (স্ট্রিং)
@see #getAge ()
নিবন্ধন করুন
** /
পাবলিক স্ট্রিং getName () {
রিটার্ন sName;
}
/ **
<P> ব্যবহারকারীর বয়স </ </ p>
@ রিটার্ন শূন্যের চেয়ে বড় বা সমান একটি সংখ্যা greater
@see ইউজার কনফিগ_সিএফজি # বয়স (পূর্ববর্তী)
@see #getName ()
** /
পাবলিক ইন্ট getAge () {
রিটার্ন আইএজ;
}
/ **
<P> ব্যবহারকারীর প্রিয় রঙ </ </ p>
@ রিটার্ন এ অ - code @ কোড নাল}, খালি নয় স্ট্রিং।
@see ইউজার কনফিগ_সিএফজি # বয়স (পূর্ববর্তী)
@see #getName ()
** /
পাবলিক স্ট্রিং get ফেভারিট কালার () {
রিটার্ন এসএফএলক্লোর;
}
//getters...END
পাবলিক স্ট্রিং টু স্ট্রিং () {
"getName () =" + getName () + ", getAge () =" + getAge () + ", getFoiceiteColor () =" + getFavoriteColor () পান;
}
}
UserConfig_Fieldable.java
/ **
<P> l @ লিঙ্ক ইউজার কনফিগ} {@ কোড ইউজারকনফিগ # ইউজারকনফিগ (ইউজারকনফিগ_ফিল্ডেবল) কনস্ট্রাক্টর Requ দ্বারা প্রয়োজনীয় </ </ p>
** /
সর্বজনীন ইন্টারফেস
স্ট্রিং getName ();
int getAge ();
স্ট্রিং getFavoriteColor ();
}
UserConfig_Cfg.java
আমদানি java.util.regex.Pattern;
/ **
<P> er @ লিঙ্ক ইউজার কনফিগ for এর জন্য নির্মাতা </ </ p>
<P> সমস্ত ক্ষেত্রের বৈধতা <CODE> ইউজার কনফিগ </CODE> কনস্ট্রাক্টরে ঘটে। তবে, প্রতিটি বৈধতার প্রয়োজনীয়তা কেবলমাত্র এই শ্রেণীর সেটার ফাংশনে ডকুমেন্ট। </ P>
** /
পাবলিক ক্লাস ইউজার কনফিগ_সিএফজি ইউজার কনফিগ_ফিল্ডেবল প্রয়োগ করে {
পাবলিক স্ট্রিং sName;
পাবলিক ইন আইএজি;
পাবলিক স্ট্রিং এসএফএলক্লোর;
/ **
<P> ব্যবহারকারীর নামের সাথে একটি নতুন উদাহরণ তৈরি করুন </ </ p>
@ পরিম s_name {@ কোড নাল} বা খালি নাও হতে পারে এবং এতে কেবল অক্ষর, সংখ্যা এবং আন্ডারস্কোর থাকতে হবে। সঙ্গে পান {@code UserConfig # getName () getName ()} {@ কোড ()} ।
** /
সর্বজনীন ব্যবহারকারীকনফিগ_সিএফজি (স্ট্রিং এর_নাম) {
sName = s_name;
}
// স্ব-প্রত্যাবর্তনকারী ... START
/ **
<P> ব্যবহারকারীর বয়স নির্ধারণ করুন </ </ p>
@param i_age শূন্যের চেয়ে কম নাও হতে পারে। সঙ্গে পান {@code UserConfig # getName () getName ()} {@ কোড ()} ।
নিবন্ধন করুন
** /
সর্বজনীন ব্যবহারকারীকনফিগ_সিএফজি বয়স (ইন্টি আই_এজ) {
iAge = i_age;
এটি ফেরত দিন;
}
/ **
<P> ব্যবহারকারীর প্রিয় রঙ সেট করুন </ </ p>
@param s_color অবশ্যই {@ কোড "লাল"}, {@ কোড "নীল"}, {@ কোড সবুজ}, বা {@ কোড "গরম গোলাপী"} হতে হবে} C @ কোড ইউজারকনফিগ # getName () getName ()} {@ কোড ()} * এর সাথে পান।
@see #age (int)
** /
পাবলিক ইউজার কনফিগ_সিএফজি ফেভারিট কালার (স্ট্রিং s_color) {
sFavColor = s_color;
এটি ফেরত দিন;
}
// স্ব-প্রত্যাবর্তনকারী ... শেষ END
//getters...START
পাবলিক স্ট্রিং getName () {
রিটার্ন sName;
}
পাবলিক ইন্ট getAge () {
রিটার্ন আইএজ;
}
পাবলিক স্ট্রিং get ফেভারিট কালার () {
রিটার্ন এসএফএলক্লোর;
}
//getters...END
/ **
<পি> কনফিগার করা হয়েছে এমনভাবে ইউজার কনফিগ তৈরি করুন </ </ p>
@ পুনর্বারণ <CODE> (নতুন {@ লিঙ্ক ইউজারফনফিং # ইউজারকনফিগ (ইউজারকনফিগ_ফিল্ডেবল) ইউজারকনফিগ this (এটি)) </ code>
** /
সর্বজনীন ব্যবহারকারী কনফিগ বিল্ড () {
রিটার্ন (নতুন ইউজার কনফিগ (এটি));
}
}