آشنایی با متد های Default در جاوا
متد های تعریف شده در Interface, نمیتوانند حاوی کد باشند. در واقع در Interface ها, تنها ساختار یک متد را مشخص میکنیم و پیاده سازی آن را به کلاسی محول میکنیم که Interface را پیاده سازی میکند. اما با استفاده از کلمه کلیدی Default, میتوانیم کد هایی را در متد های Interface قرار دهیم. در این مقاله به بررسی متد های Default میپردازیم.
در جاوا ۸, یک مبحث جدیدی معرفی شد که با استفاده از متد های Default میتوانیم متد هارا در Interface ها پیاده سازی کنیم. در واقع تا قبل از معرفی این نوع متد ها, Interface ها تنها شامل متد های Abstract بودند و پیاده سازی متد ها Interface ها در کلاس مجزا انجام میشد. بنابراین وقتی یک متد به Interface اضافه میشد, باید در تمام کلاس هایی که از این متد استفاده میکنند نیز پیاده سازی میشد.
برای مثال, متد ForEach در کلاس List وجود ندارد. حال میتوانیم این متد را به Interface که کلاس List آن را پیاده سازی کرده است, اضافه کنیم و در نهایت کلاس List نیز از این متد میتواند استفاده کند:
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
همانطور که در کد فوق مشخص است, یک Functional Interface را دریافت میکند و دستور آن را بر تمام اعضای لیست اعمال میکند.
با اضافه شدن متد Default به جاوا, عملا مشکل ارث بری از چند کلاس مرتفع شده است. اکنون یک کلاس میتواند از چندین Interface استفاده کند. در حالی که هریک از این Interface ها, یکسری متد پیاده سازی شده در خود دارند که کلاس مورد نظر میتواند از آن استفاده کند:
//// Interface 1 public interface WriterInterface { void setWriter(String writer); default void showContent(String content) { System.out.println(content); } } ///// Interface 2 public interface ZeroToHeroInterface { void setArticleCategory(String category); default String getUrl() { return "https://zerotohero.ir"; } } //// Implement public class Article implements ZeroToHeroInterface,WriterInterface{ @Override public void setWriter(String writer) { } @Override public void setArticleCategory(String category) { } }
در قطعه کد بالا, دو Interface تعریف کردهایم که در هریک از آنها یک متد Default و یک متد Abstract وجود دارد و در کلاس Article از این دو Interface استفاده کردهایم. دو متد Abstract در این کلاس پیاده سازی شدهاند. اکنون میتوانیم به این صورت از این کلاس استفاده کنیم:
public static void main(String[] args) { Article article = new Article(); article.setArticleCategory("Java"); article.setWriter("vhdrjb"); article.showContent("Java Default Method"); // Java Default Method System.out.println(article.getUrl()); /// https://zerotohero.ir }
همانطور که در کد بالا مشخص است, ما از خاصیت دو Interface استفاده کردهایم و مانند این است که کلاس Article از دو کلاس ارث بری کرده است.
گاهی ممکن است چند متد هم نام در دو Interface وجود داشته باشند. برای ایجاد تمایز و مشخص کردن متد مورد نظر باید نام Interface را پیش از متد مورد نظر ذکر کنیم. فرض کنید WriterInterface یک متد با نام getUlr داشته باشد:
public interface WriterInterface { void setWriter(String writer); default void showContent(String content) { System.out.println(content); } default String getUrl() { return "https://zerotohero.ir/authors/vhdrjb"; } }
این متد در ZeroToHeroInterface نیز وجود دارد. اکنون باید حتما این متد در کلاس Article پیاده سازی شود. علت این پیاده سازی نیز به این منظور است که مشخص شود باید از کدام متد استفاده شود. زیرا در هنگام استفاده از کلاس, دو متد با یک نام وجود دارد. متد پیاده سازی شده در کلاس Article میتواند مقدار منحصر به خود را داشته باشد. اگر بخواهیم مقدار یکی از دو Interface را مشخص کنیم, به این صورت عمل میکنیم:
public class Article implements ZeroToHeroInterface,WriterInterface{ @Override public void setWriter(String writer) { } @Override public void setArticleCategory(String category) { } @Override public String getUrl() { return ZeroToHeroInterface.super.getUrl(); } }
حال اگر از متد getUrl استفاده کنیم, مقدار موجود در ZeroToHeroInterface نمایش داده میشود. همچنین میتوانیم متد های static نیز در Interface ها تعریف کنیم:
public interface ZeroToHeroInterface { void setArticleCategory(String category); default String getUrl() { return "https://zerotohero.ir"; } static String getName() { return "ZeroToHero"; } } //// System.out.println(ZeroToHeroInterface.getName());
در این مقاله سعی بر این شد تا متد های default و شیوه پیاده سازی و استفاده از آنها را بررسی کنیم.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.