উত্তর:
স্থিতিশীল সদস্যদের একটি ইন্টারফেসে স্থাপন করা (এবং সেই ইন্টারফেসটি বাস্তবায়ন করা) একটি খারাপ অভ্যাস এবং এর জন্য একটি নামও রয়েছে কনস্ট্যান্ট ইন্টারফেস অ্যান্টিপ্যাটার্ন , কার্যকর জাভা দেখুন , আইটেম 17:
ধ্রুবক ইন্টারফেস প্যাটার্ন হ'ল ইন্টারফেসের দুর্বল ব্যবহার । কোনও শ্রেণি অভ্যন্তরীণভাবে কিছু ধ্রুবক ব্যবহার করে তা একটি বাস্তবায়ন বিশদ। ধ্রুবক ইন্টারফেস প্রয়োগের ফলে এই বাস্তবায়ন বিশদটি শ্রেণীর রফতানি হওয়া API এ ফাঁস হয়। শ্রেণীর ধ্রুবক ইন্টারফেস প্রয়োগ করে কোনও শ্রেণীর ব্যবহারকারীদের পক্ষে এটির কোনও ফল হয় না। আসলে এটি তাদের বিভ্রান্তও করতে পারে। সবচেয়ে খারাপটি, এটি একটি প্রতিশ্রুতিবদ্ধতার প্রতিনিধিত্ব করে: যদি ভবিষ্যতে প্রকাশের ক্ষেত্রে শ্রেণিটি সংশোধন করা হয় যাতে এটির আর ধ্রুবকগুলি ব্যবহার করার প্রয়োজন না হয় তবে বাইনারি সামঞ্জস্যতা নিশ্চিত করার জন্য এটি অবশ্যই ইন্টারফেসটি প্রয়োগ করতে হবে। যদি একটি ননফাইনাল শ্রেণি একটি ধ্রুবক ইন্টারফেস প্রয়োগ করে তবে এর সমস্ত সাবক্লাসের ইন্টারফেসের ধ্রুবক দ্বারা তাদের নাম স্থানগুলি দূষিত করবে।
জাভা প্ল্যাটফর্ম লাইব্রেরিতে বেশ কয়েকটি ধ্রুবক ইন্টারফেস রয়েছে, যেমন
java.io.ObjectStreamConstants
। এই ইন্টারফেসগুলি অসংলগ্নতা হিসাবে বিবেচনা করা উচিত এবং অনুকরণ করা উচিত নয়।
ধ্রুবক ইন্টারফেসের কিছু অসুবিধা এড়াতে (কারণ আপনি লোকেরা এটি প্রয়োগ থেকে আটকাতে পারবেন না), একটি প্রাইভেট কনস্ট্রাক্টর সহ একটি উপযুক্ত শ্রেণিকে অগ্রাধিকার দেওয়া উচিত (উদাহরণস্বরূপ উইকিপিডিয়া থেকে ধার করা ):
public final class Constants {
private Constants() {
// restrict instantiation
}
public static final double PI = 3.14159;
public static final double PLANCK_CONSTANT = 6.62606896e-34;
}
এবং ধ্রুবকগুলিকে সম্পূর্ণরূপে যোগ্যতা ছাড়াই অ্যাক্সেস পেতে (অর্থাত্ শ্রেণীর নামের সাথে তাদের উপসর্গ না করে), একটি স্ট্যাটিক আমদানি (জাভা 5) ব্যবহার করুন:
import static Constants.PLANCK_CONSTANT;
import static Constants.PI;
public class Calculations {
public double getReducedPlanckConstant() {
return PLANCK_CONSTANT / (2 * PI);
}
}
" ধ্রুবক ইন্টারফেস প্যাটার্নটি ইন্টারফেসের একটি দুর্বল ব্যবহার "
যে কেউ এই হাইপোটিসিসটি উপস্থাপন করেছেন, তবে তিনি যে গুরু হতে পারেন, খারাপ অভ্যাস এবং অভ্যাসগুলি দক্ষতার সাথে প্রয়োগ করা চালিয়ে যাওয়ার প্রয়োজনের ভিত্তিতে এটিকে সমঝোতা করেছিলেন। অনুমানটি খারাপ সফ্টওয়্যার ডিজাইনের অভ্যাসের বৈধতার প্রচারের ভিত্তিতে তৈরি।
আমি এখানে সেই অনুমানের বিরুদ্ধে একটি প্রতিক্রিয়া প্রত্যাখ্যান লিখেছি: জাভাতে ধ্রুবক প্রয়োগ করার সর্বোত্তম উপায় কী? এই অনুমানের ভিত্তিহীন নেস ব্যাখ্যা।
10 বছর ধরে এই প্রশ্নটি উন্মুক্ত ছিল, যতক্ষণ না আমি এই হাইপোটিসিসকে অবজ্ঞাপূর্ণ করে আমার কারণগুলি পোস্ট করার পরে 2 ঘন্টার মধ্যে বন্ধ করে দেওয়া হয়েছিল, এইভাবে যারা এই বিভ্রান্ত অনুমানকে অত্যন্ত প্রিয়ভাবে ধরে রাখেন তাদের দ্বারা বিতর্কের অনিশ্চয়তা প্রকাশ করে।
এগুলি আমি হাইপোথিসিসের বিরুদ্ধে প্রকাশ করেছি
এই হাইপোথিসিসটি ধরে রাখার জন্য ভিত্তি হ'ল খারাপ সফ্টওয়্যার অভ্যাস এবং পদ্ধতিগুলির প্রভাবগুলি মোকাবেলা করার জন্য পদ্ধতিগুলি এবং পুনরায় নিয়ন্ত্রণের প্রয়োজনীয়তা।
" ধ্রুবক ইন্টারফেস প্যাটার্ন ইন্টারফেসের একটি দুর্বল ব্যবহার " এই সংবেদনের প্রবক্তারা এই খারাপ অভ্যাস এবং অনুশীলনের প্রভাবগুলি মোকাবেলা করার প্রয়োজনের কারণে সৃষ্ট অন্য কারণগুলি সরবরাহ করতে অক্ষম।
মৌলিক বিষয়টি সমাধান করুন।
এবং তারপরে কেন জাভা ভাষা কাঠামোর প্রতিটি ভাষা বৈশিষ্ট্য আপনার নিজের সুবিধার্থে সম্পূর্ণ ব্যবহার এবং ব্যবহার না করে। কোনও জ্যাকেট প্রয়োজন নেই। আরও কার্যকর জীবনযাত্রাকে বৈষম্যমূলক ও জখম করতে আপনার অকার্যকর জীবনযাত্রাকে ব্যারিকেড করার নিয়ম কেন আবিষ্কার করবেন?
তথ্য সংস্থা। প্রক্রিয়াটির মধ্যস্থতাকারী তথ্য, তথ্যের তথাকথিত আচরণটি প্রথমে তথাকথিত ব্যবসায়ের বিধিগুলির সাথে বোঝা উচিত - প্রকৌশল বা প্রক্রিয়াটির পরিপূরক সমাধানের আগে। তথ্য সংস্থার এ জাতীয় পদ্ধতিটিকে কয়েক দশক আগে ডেটা নরমালাইজেশন বলা হয়েছিল।
তবে কেবলমাত্র একটি সমাধানের ইঞ্জিনিয়ারিং সম্ভব হতে পারে কারণ কোনও দ্রবণের উপাদানগুলির গ্রানুলারিটি এবং মডুলারালিটির সাথে তথ্যের উপাদানগুলির দানাদারতা এবং মডুলারালিটির সাথে সারিবদ্ধ করা সর্বোত্তম কৌশল।
তথ্য সংগঠিত করার ক্ষেত্রে দুটি বা তিনটি উল্লেখযোগ্য বাধা রয়েছে।
ডেটা-মডেল "নরমালাইজেশন" এর প্রয়োজনীয়তার জন্য উপলব্ধির অভাব।
ডেটা সাধারণকরণের বিষয়ে ইএফ কোডের বক্তব্য ত্রুটিযুক্ত, ত্রুটিযুক্ত এবং অস্পষ্ট।
চতুর ইঞ্জিনিয়ারিং হিসাবে সর্বশেষতম ফ্যাড মাস্ক্রেডিং হ'ল ভ্রান্ত ধারণাটি যে কারও কাছে মডিউলগুলির সংগঠন পরিকল্পনা করা এবং শর্ত করা উচিত নয় কারণ আপনি যাওয়ার সময় আপনি রিফ্যাক্টর করতে পারেন। ভবিষ্যতের আবিষ্কারগুলিতে বাধা না পেয়ে রিফ্যাক্টরিং এবং অবিচ্ছিন্ন পরিবর্তন অজুহাত হিসাবে ব্যবহৃত হয়। প্রক্রিয়া সম্পর্কিত তথ্যের আচরণের প্রয়োজনীয় আবিষ্কারগুলি হ'ল মুনাফা ও সংহতকরণে বিলম্ব করার জন্য অ্যাকাউন্টিং কৌশল ব্যবহার করে, অতএব প্রয়োজনীয় জ্ঞান এবং তাদের চিকিত্সা এখন প্রয়োজন বলে মনে করা হয় না।
আপনার অ্যাড-হক হিট-অ্যান্ড-রান প্রোগ্রামিং অভ্যাসকে ভালোবাসেন বলেই বিধি তৈরি বা কোনও ফতোয়া জারি করবেন না।
বন্দুকের মালিকানা এই কারণে নিষিদ্ধ করবেন না যে এমন লোক আছে যারা বন্দুক পরিচালনা করতে জানে না বা বন্দুকের অপব্যবহারের ঝুঁকিতে থাকে।
আপনি যে নিয়মগুলি একত্রিত করেছেন তা যদি প্রোগ্রামিং নোভিসদের পেশাদার হিসাবে কোডিং করতে না পারার জন্য হয় এবং আপনি তাদের মধ্যে নিজেকে গণনা করেন তবে তাই বলুন - আপনার ফতোয়া সঠিকভাবে সাধারণীকরণ করা ডেটা-মডেলের ক্ষেত্রে প্রযোজ্য বলে ঘোষণা করবেন না।
মার্কিন সংবিধানের জন্য প্রতিষ্ঠাতা পিতৃপুরুষের মূল উদ্দেশ্যগুলি কী ছিল তা আমি চিন্তা করি না। আমি অলিখিত নীতিবিহীন উদ্দেশ্য সম্পর্কে চিন্তা করি না। আমি কেবল লিখিত সংবিধানে আক্ষরিকভাবে কোডেড কী এবং সমাজের কার্যকর কার্যকারিতার জন্য কীভাবে সেগুলি কাজে লাগাতে পারি সে সম্পর্কেই আমি যত্নশীল।
আমি কেবল জাভা ভাষা / প্ল্যাটফর্মের চশমাগুলি আমাকে কী অনুমতি দেয় তা নিয়েই আমি যত্নশীল এবং আমি আমার সফ্টওয়্যার সমাধানগুলি দক্ষতার সাথে এবং কার্যকরভাবে প্রকাশ করার জন্য একটি মাধ্যমটি সাধ্যের জন্য তাদের পুরোপুরি কাজে লাগাতে চাই। কোনও জ্যাকেটের প্রয়োজন নেই।
মানটির মান অনুযায়ী মানচিত্রের জন্য এটি অতিরিক্ত কোড লেখার প্রয়োজন। আপনার লিখিতকরণ ছাড়াই জাভা প্রতিষ্ঠাতারা প্যারামিটার-মান ম্যাপিংয়ের জন্য সরবরাহ করেন নি যে ম্যাপিং কোডটি এনাম কনস্ট্যান্টগুলি জাভা ভাষার অনিচ্ছাকৃত ব্যবহার হিসাবে দেখায়।
বিশেষত যেহেতু আপনি আপনার প্যারামিটারগুলিকে স্বাভাবিক করতে এবং সংহত করতে উত্সাহিত হন না, তাই কোনও ভ্রান্ত ধারণা থাকবে যে এনাম ব্যাগে মিশ্রিত প্যারামিটারগুলি একই মাত্রার সাথে সম্পর্কিত।
ভুলে যাবেন না আপনি যদি নিজের ডেটা-মডেলটি ডিজাইন ও সাধারন করেন এবং সেগুলিতে ধ্রুবকগুলি অন্তর্ভুক্ত থাকে তবে সেই ধ্রুবকগুলি চুক্তি। আপনি যদি নিজের ডেটা-মডেলটি সাধারণ না করেন, তবে সেই খারাপ অভ্যাসের সাথে লড়াই করতে কীভাবে সীমাবদ্ধ কোডিং অনুশীলন করতে হবে সে সম্পর্কে আপনাকে দেওয়া ফতোয়াগুলির সাথে সম্মতি জানানো উচিত।
সুতরাং, ইন্টারফেসগুলি কনস্ট্যান্টদের চুক্তি বাস্তবায়নের একটি সঠিক উপায়।
হা. যে কেউ অজান্তেই অজান্তেই কোনও ইন্টারফেস প্রয়োগ করতে পারে। এ জাতীয় অজ্ঞাতসারে প্রোগ্রামারদের পক্ষে কিছুই দাঁড়াবে না।
অনুমানযুক্ত খারাপ অভ্যাসগুলিকে সুরক্ষিত করার জন্য বিধিনিষেধক ডিক্রিগুলি রাখবেন না যা এপিআই-এ অনিয়ন্ত্রিত / বিপথগামী প্যারামিটারগুলি ফাঁস করে দেয়। ইন্টারফেস কনস্ট্যান্টদের উপর দোষ না রেখে মৌলিক সমস্যাটি সমাধান করুন।
একটি স্বাভাবিক ক্রিয়াকলাপ এবং কার্যকর প্রোগ্রামার সেখানে প্রমাণ করতে পারে না যে সে কতক্ষণ পানির নীচে থাকতে পারে, ফোসকা গরম এবং ভেজা ঝড়ো বর্ষণে সে কতদূর হাঁটতে পারে। প্রতিদিন তার কাজকর্মের জন্য 10 মাইল দূরে নিতে তিনি গাড়ি বা বাস বা কমপক্ষে একটি বাইকের মতো দক্ষ সরঞ্জাম ব্যবহার করতে পারেন।
সহকর্মী প্রোগ্রামারদের উপর কেবল বিধিনিষেধ স্থাপন করবেন না কারণ আপনার আইডিই-কম প্রোগ্রামিংয়ের সাথে একটি তাত্পর্য তাত্পর্য রয়েছে।
ওএসজিআই এমন একটি কাঠামো। এবং ইন্টারফেস কনস্ট্যান্টগুলির বিরুদ্ধেও ডিক্রিটি একই রকম।
ইন্টারফেস ধ্রুবকগুলি একটি ডিজিটাল-মডেলটির নকশা করা এবং নকশা করা সাধারণ নকশাকে চুক্তিতে স্থাপন করার একটি কার্যকর এবং দক্ষ উপায়।
ক্লাস ফাইলে থাকা উপযুক্ত নামযুক্ত প্রাইভেট ইন্টারফেসের ইন্টারফেস ধ্রুবকগুলি আপনার সমস্ত প্রাইভেট কনস্ট্যান্টকে পুরো ফাইলটিতে ছড়িয়ে দেওয়ার পরিবর্তে গ্রুপ করা ভাল অনুশীলন।
আমি এখন এই পুরানো প্রশ্নটি বেশ কয়েকবার এসেছি এবং গৃহীত উত্তরগুলি এখনও আমাকে বিভ্রান্ত করে। অনেক চিন্তাভাবনার পরেও আমি মনে করি এই প্রশ্নটি আরও স্পষ্ট করা যেতে পারে।
কেবল তাদের তুলনা করুন:
public final class Constants {
private Constants() {
// restrict instantiation
}
public static final double PI = 3.14159;
public static final double PLANCK_CONSTANT = 6.62606896e-34;
}
বনাম
public interface Constants {
double PI = 3.14159;
double PLANCK_CONSTANT = 6.62606896e-34;
}
একই ব্যবহার। অনেক কম কোড।
আমি মনে করি @ প্যাসাল থিভেন্টের উত্তরটির ভুল জোর দেওয়া হয়েছে, এটির আমার সংস্করণটি এখানে:
স্থিতিশীল সদস্যদের একটি ইন্টারফেসে স্থাপন করা ( এবং সেই ইন্টারফেসটি বাস্তবায়ন করা ) একটি খারাপ অভ্যাস।
কার্যকর জাভা থেকে উদ্ধৃতিটি অন্যদের দ্বারা প্রয়োগ করা হচ্ছে ধ্রুবক ইন্টারফেসের ধারণা, যা আমার মনে হয় না এবং হওয়া উচিত (এবং হবে না)।
আপনি যখন কোনও ধরণের স্থির ইন্টারফেস তৈরি করেন Constants
, তখন কারও দ্বারা এটি প্রয়োগ করা উচিত নয়। (যদিও প্রযুক্তিগতভাবে সম্ভব, যা এখানে একমাত্র সমস্যা)
স্ট্যান্ডার্ড লাইব্রেরি ডিজাইনের কোনও সম্ভাব্য অপব্যবহারের সামর্থ্য রাখে না, সুতরাং আপনি কেবল সেখানে কোনওটি দেখতে পাবেন না।
তবে , স্বাভাবিক ডেভেলপারদের দৈনন্দিন প্রকল্প, ধ্রুবক ইন্টারফেস ব্যবহার করার জন্য অনেক সহজ কারণ আপনি সম্পর্কে চিন্তা করতে প্রয়োজন হবে না static
, final
, empty constructor
, ইত্যাদি, এবং এটি কোন খারাপ নকশা ইস্যু করতে পারবে না। আমি কেবলমাত্র খারাপ দিকটিই ভাবতে পারি যে এটিতে এখনও "ইন্টারফেস" এর নাম রয়েছে, তবে এর চেয়ে বেশি কিছুই নেই।
শেষে, আমি মনে করি প্রত্যেকে বই থেকে উদ্ধৃতি দিচ্ছে, এবং তাদের স্ট্যান্ডগুলিতে মতামত এবং ন্যায়সঙ্গততা দিচ্ছে। আমার জন্য ব্যতিক্রম নয়। হয়তো সিদ্ধান্ত এখনও প্রতিটি প্রকল্পের বিকাশকারীদের উপর। আপনি যদি স্বাচ্ছন্দ্য বোধ করেন তবে এটি ব্যবহার করতে এগিয়ে যান। আমরা যা করতে পারি তা হ'ল প্রকল্পের পুরো অংশে এটি ধারাবাহিক করা ।
public
বাদ দেওয়া যেতে পারে কারণ এটি একটি ইন্টারফেস, কেবল এটির double PI = 3.14159;
ব্যবহারটি ইন্টারফেস Constants.PI
বাস্তবায়নের জন্য ক্লাসের প্রয়োজন হয় না Constants
! আমি মনে করি ইন্টারফেসের পদ্ধতির ব্যবহারের ক্ষেত্রে অনেক বেশি পরিষ্কার, আইএমএইচও
জোশুয়া ব্লচ, "কার্যকর জাভা - প্রোগ্রামিং ভাষা নির্দেশিকা":
ধ্রুবক ইন্টারফেস প্যাটার্ন হ'ল ইন্টারফেসের দুর্বল ব্যবহার। কোনও শ্রেণি অভ্যন্তরীণভাবে কিছু ধ্রুবক ব্যবহার করে তা একটি বাস্তবায়ন বিশদ। ধ্রুবক ইন্টারফেস প্রয়োগের ফলে এই বাস্তবায়ন বিশদটি শ্রেণীর রফতানি হওয়া API এ ফাঁস হয়। শ্রেণীর ধ্রুবক ইন্টারফেস প্রয়োগ করে কোনও শ্রেণীর ব্যবহারকারীদের পক্ষে এটির কোনও ফল হয় না। আসলে এটি তাদের বিভ্রান্তও করতে পারে। সবচেয়ে খারাপটি, এটি একটি প্রতিশ্রুতিবদ্ধতার প্রতিনিধিত্ব করে: যদি ভবিষ্যতে প্রকাশের ক্ষেত্রে শ্রেণিটি সংশোধিত হয় যাতে এটির আর ধ্রুবকগুলি ব্যবহার করার প্রয়োজন না হয় তবে বাইনারি সামঞ্জস্যতা নিশ্চিত করার জন্য এটি অবশ্যই ইন্টারফেসটি প্রয়োগ করতে হবে। যদি একটি ননফাইনাল শ্রেণি একটি ধ্রুবক ইন্টারফেস প্রয়োগ করে তবে এর সমস্ত সাবক্লাসের ইন্টারফেসের ধ্রুবক দ্বারা তাদের নাম স্থানগুলি দূষিত করবে।
আপনার যদি সাধারণ ধ্রুবক থাকে যা ক্লাসে ইন্টারফেস প্রয়োগ করে তা ব্যবহার করা যায় তবে সেগুলি কার্যকর।
এখানে একটি উদাহরণ রয়েছে: http://www.javapractices.com/topic/TopicAction.do?Id=32
তবে মনে রাখবেন যে প্রস্তাবিত অনুশীলনটি ইন্টারফেসগুলিতে স্থির পরিবর্তে স্থির আমদানি ব্যবহার করা। এখানে একটি রেফারেন্স দেওয়া হয়েছে: http://www.javapractices.com/topic/TopicAction.do?Id=195
এমন উত্তর রয়েছে যা খুব অনুরণনযোগ্য।
তবে এই প্রশ্নটি সম্পর্কে আমার কিছু চিন্তাভাবনা আছে। (ভুল হতে পারে)
আমার মতে, একটি ইন্টারফেসের ক্ষেত্রগুলি পুরো প্রকল্পের ধ্রুবক হওয়া উচিত নয়, এগুলি কেবল ইন্টারফেসের জন্য এবং ইন্টারফেসগুলির জন্য এবং ক্লাসগুলি যা এই ইন্টারফেসগুলি প্রয়োগ করে বা তাদের সাথে ঘনিষ্ঠ সম্পর্ক রাখে। এগুলি বিশ্বব্যাপী নয় একটি নির্দিষ্ট সীমার মধ্যে ব্যবহার করা উচিত।
ইন্টারফেস সম্পর্কে দুটি পয়েন্ট:
একটি ইন্টারফেস কোনও বস্তু যা এটি প্রয়োগ করতে পারে তা কী করতে পারে তার একটি উপসেট বর্ণনা করে । (এটি স্বজ্ঞাততা)
একটি ইন্টারফেস সাধারণ স্থায়িত্বগুলি বর্ণনা করে যার পরে এটি কার্যকর করে objects
সুতরাং আমি মনে করি বিশ্বব্যাপী ধ্রুবকগুলির জন্য যদি কনস্ট্যান্ট ইন্টারফেস ব্যবহার না করা হয় তবে তা গ্রহণযোগ্য:
implements
এটি (এবং অবশ্যই, প্রয়োগের ক্ষেত্রে এই সাধারণ ধ্রুবকগুলি ব্যবহার করুন)।উদাহরণ:
interface Drawable {
double GOLDEN_RATIO = 1.618033988;
double PI = 3.141592653;
...
// methods
...
}
public class Circle implements Drawable {
...
public double getCircumference() {
return 2 * PI * r;
}
}
void usage() {
Circle circle = new Circle(radius: 3.0);
double maxRadius = 5.0;
if ( circle.getCircumference() < 2 * Circle.PI * maxRadius ) {
...
}
}
এই উদাহরণে:
Circle implements Drawable
, আপনি অবিলম্বে জানি Circle
সম্ভবত ধ্রুবক সংজ্ঞায়িত নিশ্চয়তা হয় Drawable
, অন্যথায় তারা ভাল বেশী থেকে খারাপ নাম চয়ন আছে PI
এবং GOLDEN_RATIO
ইতিমধ্যে গ্রহণ করা হয়েছে!Drawable
অবজেক্টগুলি নির্দিষ্ট অনুসারে PI
এবং GOLDEN_RATIO
সংজ্ঞায়িত হয়েছে Drawable
, এমন বস্তু থাকতে পারে যা Drawable
পাই এবং সুবর্ণ অনুপাতের আলাদা নির্ভুলতার সাথে নয় ।javax.swing.SwingConstants
ইন্টারফেস একটি উদাহরণ যা স্ট্যাটিক ক্ষেত্র যা দোল শ্রেণীর মধ্যে ব্যবহার করা হয় পেয়েছিলাম। এটি আপনাকে সহজেই এমন কিছু ব্যবহার করতে দেয়
this.add(LINE_START, swingcomponent);
this.add(this.LINE_START, swingcomponent);
অথবা this.add(SwingComponents.LINE_START, swingcomponent);
তবে এই ইন্টারফেসের কোনও পদ্ধতি নেই ...
আমি এই প্রশ্নটি জুড়ে এসে ভাবলাম যে আমি এমন কিছু যুক্ত করব যা উল্লেখ করা হয়নি। সাধারণভাবে, আমি এখানে পাস্কেলের উত্তরের সাথে একমত । তবে আমি মনে করি না যে কোনও ইন্টারফেসের ধ্রুবকগুলি "সর্বদা" একটি অ্যান্টিপ্যাটার্ন হয়।
উদাহরণস্বরূপ, আপনি যে ধ্রুবকগুলি সংজ্ঞায়িত করছেন সেটি যদি সেই ইন্টারফেসের জন্য একটি চুক্তির অংশ হয় তবে আমি মনে করি ইন্টারফেসটি ধ্রুবকদের জন্য একটি দুর্দান্ত জায়গা। কিছু ক্ষেত্রে, আপনার প্রয়োগের ব্যবহারকারীদের কাছে চুক্তি প্রকাশ না করেই ব্যক্তিগতভাবে আপনার পরামিতিগুলিকে বৈধতা দেওয়া ঠিক নয়। জনসাধারণের মুখোমুখি চুক্তি ব্যতীত, ব্যবহারকারীরা কেবল অনুমান করতে পারেন যে আপনার ক্লাসটি ক্ষয় করার এবং আপনার কোডটি পড়ার সংক্ষিপ্ততার সাথে কী বৈধতা রয়েছে।
সুতরাং যদি আপনি কোনও ইন্টারফেস প্রয়োগ করেন এবং ইন্টারফেসে আপনার চুক্তিগুলি নিশ্চিত করার ক্ষেত্রে ব্যবহার করার ধ্রুবক রয়েছে (উদাহরণস্বরূপ পূর্ণসংখ্যার ব্যাপ্তি), তবে আপনার শ্রেণীর একজন ব্যবহারকারী নিশ্চিত হতে পারেন যে তারা ইন্টারফেসের ধ্রুবকের বিরুদ্ধে পরীক্ষা করে সঠিকভাবে ইন্টারফেসের উদাহরণটি ব্যবহার করছেন? নিজেদের. এই অসম্ভব হবে যদি ধাপগুলি আপনার প্রয়োগের জন্য ব্যক্তিগত ছিল বা আপনার বাস্তবায়নটি প্যাকেজ ব্যক্তিগত বা অন্য কোনও কিছু ছিল।
ক্লাসের মধ্যে ভাগ করে নেওয়া ধ্রুবকের সাথে ডিল করার সময় আমি ইন্টারফেস ধ্রুবকগুলি ব্যবহার করি।
public interface TestConstants
{
String RootLevelConstant1 = "RootLevelConstant1";
interface SubGroup1
{
String SubGroupConstant1 = "SubGroup1Constant1";
String SubGroupConstant2 = "SubGroup1Constant2";
}
interface SubGroup2
{
String SubGroupConstant1 = "SubGroup2Constant1";
String SubGroupConstant2 = "SubGroup2Constant2";
}
}
গ্রুপিং একটি বিশাল সম্পদ, বিশেষত ধ্রুবকগুলির একটি বিশাল সেট।
ব্যবহার করতে, আপনি কেবল তাদের একসাথে চেইন করুন:
System.out.println(TestConstants.SubGroup1.SubGroupConstant1);
System.out.println(TestConstants.SubGroup2.SubGroupConstant1);
System.out.println(TestConstants.RootLevelConstant1);
ক্ষেত্রগুলিকে একটি ইন্টারফেসে ঘোষণা করা উচিত যাতে এগুলি ভাগ করা সহজ হয় এবং অতিরিক্ত সংযোগের সূচনা না করে রেফারেন্স করা যায়।