لطفا زیاد ترول نکنید، من تازه شروع به ترجمه مقالات کردم
یک اینترفیس میتواند از یک رابط دیگر ارث بری کند؛ اگر اینترفیس از یک رابط کاربردی ارث بری کند و متدهای انتزاعی جدیدی نداشته باشد، این رابط نیز کاربردی است. اما یک رابط فقط می تواند شامل یک روش انتزاعی و بسیاری از روش های پیش فرض باشد و همچنان کاربردی در نظر گرفته می شود.
مقدمه ای بر رابط های کاربردی - مفاهیم بازسازی شده در جاوا 8
هر توسعه دهنده جاوا در جهان حداقل یک بار از یکی از اینترفیس های زیر استفاده کرده است:java.lang.Runnable
, java.awt.event.ActionListener
, java.util.Comparator
, java.util.concurrent.Callable
. همه آنها یک چیز مشترک دارند و آن این است که همه آنها فقط یک روش دارند. بسیاری از اینترفیسهای دیگر در JDK و همچنین سایر رابطهای ایجاد شده توسط توسعهدهندگان جاوا وجود دارد. این رابط ها با نام Single Abstract Method interfaces
(SAM Interface) نیز شناخته می شوند. یکی از محبوبترین راهها برای استفاده از این رابطها، ایجاد کلاسهای داخلی ناشناس است که از این رابطها استفاده میکنند، مانند مثال زیر:
public class AnonymousInnerClassTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("A thread created and running...");
}
}).start();
}
}
در جاوا 8، مفهوم SAM بازسازی شده و رابط های کاربردی نامیده می شود. آنها را می توان با استفاده از عبارات لامبدا، مراجع روش و سازنده های مرجع نشان داد. یک حاشیه نویسی @FunctionalInterface ایجاد شده است که برای ایجاد خطا در سطح کامپایلر زمانی که رابطی که شما یادداشت کرده اید در سطح عملکردی کار نمی کند استفاده می شود. بیایید به یک رابط کاربردی ساده با یک روش انتزاعی نگاه کنیم:
@FunctionalInterface
public interface SimpleFunInterface {
public void doWork();
}
یک اینترفیس همچنین میتواند متدهای انتزاعی را از یک کلاس اعلان کند java.lang.Object
، اما در این مورد رابط را میتوان تابعی نیز اعلام کرد:
@FunctionalInterface
public interface SimpleFuncInterface {
public void doWork();
public String toString();
public Boolean equals(Object o);
}
به محض اینکه روش انتزاعی دیگری را به رابط اضافه کردید، IDE آن را مانند تصویر اشتباه علامت گذاری می کند:
دیگر چه بخوانیم: |
---|
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
default public void doSomeWork() {
System.out.println("Doing some work in interface impl...");
}
default public void doSomeWork() {
System.out.println("Doing some other work in interface impl...");
}
}
مثال برتر هنوز یک رابط کاربردی است. حال بیایید ببینیم چگونه می توانیم از عبارات لامبدا برای جایگزینی یک کلاس داخلی ناشناس برای پیاده سازی رابط های کاربردی استفاده کنیم:
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
public static void main(String[] args) {
carryOutWork(new SimpleFunInterface() {
@Override
public void doWork() {
System.out.println("Do work in SimpleFun impl...");
}
});
carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
}
public static void carryOutWork(SimpleFuncInterface sfi) {
sfi.work();
}
}
نتیجه برنامه به شرح زیر خواهد بود:
Do work in SimpleFun impl...
Do work in lambda exp impl...
در صورتی که از یک IDE استفاده میکنید که از نحو عبارت لامبدا جاوا پشتیبانی میکند (Netbeans 8 Nightly builds) - هنگام استفاده از کلاسهای داخلی ناشناس، راهنمایی دریافت میکنید: این مقدمه کوتاهی بود بر مفهوم رابطهای کاربردی در جاوا 8 و نحوه پیادهسازی آنها. با استفاده از عبارات لامبدا
GO TO FULL VERSION