অ্যাবস্ট্যাক্ট শ্রেণি এবং ইন্টারফেসের মধ্যে পার্থক্য
- জাভা 8-এ অ্যাবস্ট্রাক্ট ক্লাস বনাম ইন্টারফেস
- ধারণাগত পার্থক্য:
জাভা 8 এ ইন্টারফেস ডিফল্ট পদ্ধতি
- ডিফল্ট পদ্ধতি কী?
- ডিফল্ট পদ্ধতি ব্যবহার করে প্রতিটি পদ্ধতি সংকলনের ত্রুটি সমাধান করা হয়েছে
- ডিফল্ট পদ্ধতি এবং একাধিক উত্তরাধিকার দ্ব্যর্থতা সমস্যা
- জাভা ইন্টারফেস ডিফল্ট পদ্ধতি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট:
জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি
- জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি, কোড উদাহরণ, স্থির পদ্ধতি বনাম ডিফল্ট পদ্ধতি
- জাভা ইন্টারফেস স্থির পদ্ধতি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট:
জাভা ফাংশনাল ইন্টারফেস
জাভা 8-এ অ্যাবস্ট্রাক্ট ক্লাস বনাম ইন্টারফেস
জাভা 8 ইন্টারফেস পরিবর্তনগুলি ইন্টারফেসে স্থির পদ্ধতি এবং ডিফল্ট পদ্ধতি অন্তর্ভুক্ত করে। জাভা 8 এর পূর্বে, আমাদের ইন্টারফেসগুলিতে কেবল পদ্ধতি ঘোষণা থাকতে পারে। তবে জাভা 8 থেকে, আমাদের ইন্টারফেসগুলিতে ডিফল্ট পদ্ধতি এবং স্থির পদ্ধতি থাকতে পারে।
ডিফল্ট পদ্ধতি প্রবর্তন করার পরে, মনে হয় ইন্টারফেস এবং বিমূর্ত শ্রেণিগুলি একই রকম। তবে জাভা 8 এ এগুলি এখনও আলাদা ধারণা।
বিমূর্ত শ্রেণি নির্মাতাকে সংজ্ঞায়িত করতে পারে। তারা আরও কাঠামোগত এবং তাদের সাথে একটি রাজ্য যুক্ত থাকতে পারে। বিপরীতে, ডিফল্ট পদ্ধতিটি কেবলমাত্র অন্য ইন্টারফেস পদ্ধতিতে প্রয়োগের ক্ষেত্রে প্রয়োগ করা যেতে পারে, নির্দিষ্ট প্রয়োগের অবস্থার কোনও উল্লেখ নেই। অতএব, উভয়ই বিভিন্ন উদ্দেশ্যে ব্যবহৃত হয় এবং দুটির মধ্যে বেছে নেওয়া সত্যই দৃশ্যের প্রসঙ্গে।
ধারণাগত পার্থক্য:
বিমূর্ত শ্রেণিগুলি ইন্টারফেসের কঙ্কালের (অর্থাত্ আংশিক) বাস্তবায়নের জন্য বৈধ তবে কোনও মিলের ইন্টারফেস ছাড়া এটি থাকা উচিত নয়।
সুতরাং যখন বিমূর্ত শ্রেণিগুলি কার্যকরভাবে কম-দৃশ্যমানতা হ্রাস করা হয়, ইন্টারফেসগুলির কঙ্কালের বাস্তবায়ন হয়, তখন ডিফল্ট পদ্ধতিগুলিও এটিকেও সরিয়ে নিতে পারে? সিদ্ধান্ত নিয়ে: না! ইন্টারফেস কার্যকর করার জন্য প্রায়শই কিছু বা সমস্ত শ্রেণি-নির্মানের সরঞ্জামের প্রয়োজন হয় যা ডিফল্ট পদ্ধতির অভাব থাকে। এবং যদি কিছু ইন্টারফেস না করে তবে এটি স্পষ্টভাবে একটি বিশেষ ক্ষেত্রে, যা আপনাকে বিপথগামী না করে should
জাভা 8 এ ইন্টারফেস ডিফল্ট পদ্ধতি
জাভা 8 " ডিফল্ট পদ্ধতি " বা (ডিফেন্ডার পদ্ধতি) নতুন বৈশিষ্ট্য উপস্থাপন করেছে, যা বিকাশকারীকে এই ইন্টারফেসের বিদ্যমান বাস্তবায়ন ভঙ্গ না করে ইন্টারফেসগুলিতে নতুন পদ্ধতি যুক্ত করতে দেয়। এটি ইন্টারফেস বাস্তবায়ন সংজ্ঞায়িত করার অনুমতি দেয় যা এমন পরিস্থিতিতে ডিফল্ট হিসাবে ব্যবহার করবে যেখানে কোনও কংক্রিট শ্রেণি সেই পদ্ধতির জন্য কোনও প্রয়োগ প্রদান করতে ব্যর্থ হয়।
এটি কীভাবে কাজ করে তা বুঝতে ছোট উদাহরণ বিবেচনা করুন:
public interface OldInterface {
public void existingMethod();
default public void newDefaultMethod() {
System.out.println("New default method"
+ " is added in interface");
}
}
নিম্নলিখিত ক্লাসটি জাভা জেডিকে 8 তে সফলভাবে সংকলন করবে,
public class OldInterfaceImpl implements OldInterface {
public void existingMethod() {
// existing implementation is here…
}
}
আপনি যদি ওল্ডআইন্টারফেসআইএমপিএল এর উদাহরণ তৈরি করেন:
OldInterfaceImpl obj = new OldInterfaceImpl ();
// print “New default method add in interface”
obj.newDefaultMethod();
ডিফল্ট পদ্ধতিগুলি কখনই চূড়ান্ত হয় না, সিঙ্ক্রোনাইজ করা যায় না এবং অবজেক্টের পদ্ধতিগুলিকে ওভাররাইড করতে পারে না। এগুলি সর্বদা সর্বজনীন, যা সংক্ষিপ্ত এবং পুনরায় ব্যবহারযোগ্য পদ্ধতিগুলি লেখার ক্ষমতা মারাত্মকভাবে সীমাবদ্ধ করে।
ডিফল্ট পদ্ধতিগুলি একটি ইন্টারফেসে সরবরাহ করা যেতে পারে ক্লাসগুলি প্রয়োগ না করে কারণ এটিতে একটি প্রয়োগ রয়েছে। যদি ইন্টারফেসে প্রতিটি যুক্ত পদ্ধতি প্রয়োগের সাথে সংজ্ঞায়িত হয় তবে কোনও প্রয়োগকারী শ্রেণি ক্ষতিগ্রস্থ হয় না। একটি বাস্তবায়নকারী শ্রেণি ইন্টারফেসের সরবরাহিত ডিফল্ট প্রয়োগকে ওভাররাইড করতে পারে।
ডিফল্ট পদ্ধতিগুলি এই ইন্টারফেসগুলির পুরানো বাস্তবায়ন ভঙ্গ না করে বিদ্যমান ইন্টারফেসগুলিতে নতুন কার্যকারিতা যুক্ত করতে সক্ষম করে।
যখন আমরা একটি ইন্টারফেস প্রসারিত করি যেখানে একটি ডিফল্ট পদ্ধতি রয়েছে, আমরা নিম্নলিখিতটি সম্পাদন করতে পারি,
- ডিফল্ট পদ্ধতি ওভাররাইড না করে ডিফল্ট পদ্ধতির উত্তরাধিকারী হবে।
- আমরা সাবক্লাসে ওভাররাইড করা অন্যান্য পদ্ধতির মতো ডিফল্ট পদ্ধতি ওভাররাইড করে।
- বিমূর্ত হিসাবে পুনরায় ঘোষিত ডিফল্ট পদ্ধতি, যা সাবক্লাসকে ওভাররাইড করতে বাধ্য করে।
ডিফল্ট পদ্ধতি ব্যবহার করে প্রতিটি পদ্ধতি সংকলনের ত্রুটি সমাধান করা হয়েছে
জাভা 8-র জন্য, জেডিকে সংগ্রহগুলি প্রসারিত করা হয়েছে এবং প্রতিটি সংগ্রহের জন্য পুরো সংগ্রহটিতে (যা ল্যাম্বডাসের সাথে কাজ করে) যুক্ত করা হয়েছে is প্রচলিত উপায়ে, কোডটি নীচের মত দেখাচ্ছে,
public interface Iterable<T> {
public void forEach(Consumer<? super T> consumer);
}
এই ফলস্বরূপ প্রতিটি সংঘবদ্ধ ত্রুটি সহ বাস্তবায়নকারী ক্লাস, অতএব একটি বিদ্যমান ডিফল্ট পদ্ধতি প্রয়োজনীয় বাস্তবায়নের সাথে যুক্ত হয়েছে যাতে বিদ্যমান প্রয়োগটি পরিবর্তন করা যায় না।
ডিফল্ট পদ্ধতি সহ ইটেবল ইন্টারফেসটি নীচে রয়েছে,
public interface Iterable<T> {
public default void forEach(Consumer
<? super T> consumer) {
for (T t : this) {
consumer.accept(t);
}
}
}
বাস্তবায়নকারী ক্লাসগুলি না ভেঙে জেডিকে ইন্টারফেসে স্ট্রিম যুক্ত করতে একই প্রক্রিয়া ব্যবহার করা হয়েছে ।
ডিফল্ট পদ্ধতি এবং একাধিক উত্তরাধিকার দ্ব্যর্থতা সমস্যা
যেহেতু জাভা ক্লাস একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে এবং প্রতিটি ইন্টারফেস একই পদ্ধতির স্বাক্ষরের সাথে ডিফল্ট পদ্ধতিটি সংজ্ঞায়িত করতে পারে, সুতরাং উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিগুলি একে অপরের সাথে বিরোধ করতে পারে।
নীচে উদাহরণ বিবেচনা করুন,
public interface InterfaceA {
default void defaultMethod(){
System.out.println("Interface A default method");
}
}
public interface InterfaceB {
default void defaultMethod(){
System.out.println("Interface B default method");
}
}
public class Impl implements InterfaceA, InterfaceB {
}
উপরের কোডটি নিম্নলিখিত ত্রুটির সাথে সংকলন করতে ব্যর্থ হবে,
জাভা: ক্লাস ইমপ্ল ইন্টারফেসএ এবং ইন্টারফেসবি টাইপ থেকে ডিফল্টমেথড () এর জন্য সম্পর্কযুক্ত ডিফল্ট উত্তরাধিকার সূত্রে প্রাপ্ত
এই শ্রেণিটি ঠিক করতে, আমাদের ডিফল্ট পদ্ধতি প্রয়োগের প্রয়োজন:
public class Impl implements InterfaceA, InterfaceB {
public void defaultMethod(){
}
}
তদুপরি, আমরা যদি আমাদের নিজস্ব প্রয়োগের পরিবর্তে সুপার ইন্টারফেসের কোনও দ্বারা সরবরাহিত ডিফল্ট বাস্তবায়ন প্রার্থনা করতে চাই তবে আমরা নীচের মতো এটি করতে পারি,
public class Impl implements InterfaceA, InterfaceB {
public void defaultMethod(){
// existing code here..
InterfaceA.super.defaultMethod();
}
}
আমরা আমাদের নতুন পদ্ধতির অংশ হিসাবে কোনও ডিফল্ট বাস্তবায়ন বা উভয়ই চয়ন করতে পারি।
জাভা ইন্টারফেস ডিফল্ট পদ্ধতি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট:
- জাভা ইন্টারফেসের ডিফল্ট পদ্ধতিগুলি বাস্তবায়ন ক্লাস ভাঙার ভয় ছাড়াই আমাদের ইন্টারফেসগুলি প্রসারিত করতে সহায়তা করবে।
- জাভা ইন্টারফেস ডিফল্ট পদ্ধতি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্য কমিয়ে দেয়।
- জাভা 8 ইন্টারফেসের ডিফল্ট পদ্ধতিগুলি ইউটিলিটি ক্লাসগুলি এড়াতে আমাদের সহায়তা করবে, যেমন সমস্ত সংগ্রহ শ্রেণির পদ্ধতি ইন্টারফেসে নিজেই সরবরাহ করা যেতে পারে।
- জাভা ইন্টারফেসের ডিফল্ট পদ্ধতিগুলি বেস বাস্তবায়ন ক্লাসগুলি অপসারণে আমাদের সহায়তা করবে, আমরা ডিফল্ট বাস্তবায়ন সরবরাহ করতে পারি এবং বাস্তবায়ন ক্লাসগুলি বেছে নিতে পারে কোনটি ওভাররাইড করা উচিত।
- ইন্টারফেসে ডিফল্ট পদ্ধতি প্রবর্তনের অন্যতম প্রধান কারণ লাম্বদা এক্সপ্রেশন সমর্থন করার জন্য জাভা 8-তে সংগ্রহের API উন্নত করা।
- শ্রেণিবিন্যাসের যে কোনও শ্রেণির যদি একই স্বাক্ষরযুক্ত কোনও পদ্ধতি থাকে তবে ডিফল্ট পদ্ধতিগুলি অপ্রাসঙ্গিক হয়ে যায়। একটি ডিফল্ট পদ্ধতি java.lang.Object থেকে কোনও পদ্ধতিকে ওভাররাইড করতে পারে না। যুক্তিটি খুব সহজ, কারণ কারণ জাভা সমস্ত জাভা শ্রেণীর জন্য বেস শ্রেণি। সুতরাং যদি আমাদের ইন্টারফেসগুলিতে ডিফল্ট পদ্ধতি হিসাবে অবজেক্ট শ্রেণির পদ্ধতিগুলি সংজ্ঞায়িত করা হয় তবে এটি অকেজো হবে কারণ অবজেক্ট শ্রেণির পদ্ধতিটি সর্বদা ব্যবহৃত হবে। এই কারণেই বিভ্রান্তি এড়াতে, আমাদের ডিফল্ট পদ্ধতি থাকতে পারে না যা অবজেক্ট শ্রেণির পদ্ধতিগুলিকে ওভাররাইড করে।
- জাভা ইন্টারফেসের ডিফল্ট পদ্ধতিগুলিকে ডিফেন্ডার পদ্ধতি বা ভার্চুয়াল এক্সটেনশন পদ্ধতি হিসাবেও উল্লেখ করা হয়।
সংস্থান লিঙ্ক:
- জাভা 8-এ অ্যাবস্ট্রাক্ট বনাম ডিফল্ট পদ্ধতিগুলির সাথে ইন্টারফেস
- জেডিকে 8 এর যুগে বিমূর্ত শ্রেণি বনাম ইন্টারফেস
- ভার্চুয়াল এক্সটেনশন পদ্ধতিগুলির মাধ্যমে ইন্টারফেস বিবর্তন
জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি
জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি, কোড উদাহরণ, স্থির পদ্ধতি বনাম ডিফল্ট পদ্ধতি
জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি ডিফল্ট পদ্ধতির অনুরূপ ব্যতীত আমরা এগুলি বাস্তবায়ন ক্লাসগুলিতে ওভাররাইড করতে পারি না। এই বৈশিষ্ট্যটি বাস্তবায়ন ক্লাসগুলিতে দুর্বল প্রয়োগের অনাকাঙ্ক্ষিত ফলাফল এড়াতে আমাদের সহায়তা করে। এর একটি সাধারণ উদাহরণ দিয়ে এটি সন্ধান করা যাক।
public interface MyData {
default void print(String str) {
if (!isNull(str))
System.out.println("MyData Print::" + str);
}
static boolean isNull(String str) {
System.out.println("Interface Null Check");
return str == null ? true : "".equals(str) ? true : false;
}
}
এখন আসুন এমন একটি বাস্তবায়ন শ্রেণি দেখুন যা নিখরচায় বাস্তবায়নের সাথে ইস্কুল () পদ্ধতি রয়েছে।
public class MyDataImpl implements MyData {
public boolean isNull(String str) {
System.out.println("Impl Null Check");
return str == null ? true : false;
}
public static void main(String args[]){
MyDataImpl obj = new MyDataImpl();
obj.print("");
obj.isNull("abc");
}
}
মনে রাখবেন যে isNull (স্ট্রিং স্ট্রিং) একটি সাধারণ শ্রেণিবদ্ধ পদ্ধতি, এটি ইন্টারফেস পদ্ধতিটি ওভাররাইড করে না। উদাহরণস্বরূপ, আমরা যদি @ ওভাররাইড টীকাটি isNull () পদ্ধতিতে যুক্ত করব তবে এর ফলে সংকলক ত্রুটি হবে।
এখন যখন আমরা অ্যাপ্লিকেশনটি চালাব, আমরা নিম্নলিখিত আউটপুট পাব।
ইন্টারফেস নাল চেক
ইমপ্ল নাল চেক
যদি আমরা স্থিতিশীল থেকে ডিফল্টরূপে ইন্টারফেস পদ্ধতিটি তৈরি করি তবে আমরা নিম্নলিখিত আউটপুট পাব।
ইমপ্ল নাল চেক
মাইডাটা প্রিন্ট ::
ইমপ্ল নাল চেক
জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতিটি কেবলমাত্র ইন্টারফেস পদ্ধতির জন্য দৃশ্যমান, আমরা যদি মাইডাটাআইএমপিএল ক্লাস থেকে isNull () পদ্ধতিটি সরিয়ে ফেলি, তবে আমরা এটি মাইডেটাআইএমপিএল অবজেক্টের জন্য ব্যবহার করতে সক্ষম হব না। তবে অন্যান্য স্ট্যাটিক পদ্ধতির মতো আমরা শ্রেণীর নাম ব্যবহার করে ইন্টারফেস স্ট্যাটিক পদ্ধতি ব্যবহার করতে পারি। উদাহরণস্বরূপ, একটি বৈধ বিবৃতি হবে:
boolean result = MyData.isNull("abc");
জাভা ইন্টারফেস স্থির পদ্ধতি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট:
- জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি ইন্টারফেসের অংশ, আমরা এটি প্রয়োগের শ্রেণীর অবজেক্টের জন্য ব্যবহার করতে পারি না।
- জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি ইউটিলিটি পদ্ধতি সরবরাহের জন্য ভাল, উদাহরণস্বরূপ নাল চেক, সংগ্রহের বাছাই ইত্যাদি providing
- জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি বাস্তবায়ন ক্লাসগুলিকে ওভাররাইড না করার মাধ্যমে সুরক্ষা সরবরাহ করতে সহায়তা করে।
- আমরা বস্তু শ্রেণীর পদ্ধতিগুলির জন্য ইন্টারফেস স্থিতির পদ্ধতিটি সংজ্ঞায়িত করতে পারি না, আমরা "এই স্থির পদ্ধতিটি বস্তুর থেকে উদাহরণ পদ্ধতিটি আড়াল করতে পারে না" হিসাবে সংকলক ত্রুটি পেয়ে যাব। এর কারণ এটি জাভাতে অনুমোদিত নয়, যেহেতু অবজেক্টটি সমস্ত শ্রেণীর জন্য বেস শ্রেণি এবং আমাদের এক শ্রেণীর স্তরের স্ট্যাটিক পদ্ধতি এবং একই স্বাক্ষরের সাথে অন্য উদাহরণ পদ্ধতি থাকতে পারে না।
- সংগ্রহের মতো ইউটিলিটি ক্লাসগুলি মুছে ফেলার জন্য আমরা জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি ব্যবহার করতে পারি এবং এর সমস্ত স্থিতিশীল পদ্ধতিগুলিকে সংশ্লিষ্ট ইন্টারফেসে স্থানান্তর করতে পারি, এটি সন্ধান এবং ব্যবহার করা সহজ।
জাভা ফাংশনাল ইন্টারফেস
পোস্টটি শেষ করার আগে আমি ফাংশনাল ইন্টারফেসগুলির একটি সংক্ষিপ্ত পরিচিতি সরবরাহ করতে চাই। ঠিক একটি বিমূর্ত পদ্ধতিযুক্ত একটি ইন্টারফেস ফাংশনাল ইন্টারফেস হিসাবে পরিচিত।
@FunctionalInterface
একটি ইন্টারফেসকে ফাংশনাল ইন্টারফেস হিসাবে চিহ্নিত করতে একটি নতুন টীকাগুলি চালু করা হয়েছে। @FunctionalInterface
ক্রিয়ামূলক ইন্টারফেসগুলিতে বিমূর্ত পদ্ধতিতে দুর্ঘটনাক্রমে সংযোজন এড়ানোর জন্য এনোটেশন একটি সুবিধা। এটি ব্যবহার করা optionচ্ছিক তবে ভাল অনুশীলন।
ক্রিয়ামূলক ইন্টারফেসগুলি দীর্ঘ প্রতীক্ষিত এবং জাভা 8 এর বৈশিষ্ট্য বহুল প্রত্যাশিত কারণ এটি আমাদের তাত্ক্ষণিকভাবে ল্যাম্বডা এক্সপ্রেশনগুলি ব্যবহার করতে সক্ষম করে। ল্যাম্বডা এক্সপ্রেশন এবং পদ্ধতি রেফারেন্সের জন্য লক্ষ্য প্রকার সরবরাহ করতে গুচ্ছ ক্রিয়ামূলক ইন্টারফেসগুলির সাথে একটি নতুন প্যাকেজ java.util.function যুক্ত করা হয়েছে। আমরা ভবিষ্যতের পোস্টগুলিতে ক্রিয়ামূলক ইন্টারফেস এবং ল্যাম্বডা অভিব্যক্তিগুলি খতিয়ে দেখব।
সংস্থান অবস্থান:
- জাভা 8 ইন্টারফেস পরিবর্তন - স্থির পদ্ধতি, ডিফল্ট পদ্ধতি