371. Java anonymous type

בהמשך לפעם הקודמת,

נראה כעת Feature שיש בJava שאין בC#.

הFeature נקרא Anonymous types.

גם בC# קיים Feature בשם Anonymous types, אבל הוא קצת שונה (ראו גם טיפ מספר 90)

בJava הFeature מאפשר לנו לממש ממשק בתוך מתודה.

איך עושים את זה? נניח שיש לנו את הממשק הבא של Java:

1
2
3
4
interface Runnable
{
public void run();
}

נוכל לממשו כך בתוך מתודה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MyAnnonymousExample
{
private String _member = "This is a private member";
public void test(String value)
{
Runnable runnable =
new Runnable()
{
@Override
public void run()
{
System.out.println("Hi, I just met you");
System.out.println("And this is crazy");
System.out.println("But here's your value: " + value);
System.out.println("So, call me maybe?");
System.out.println(_member);
System.out.println("It's hard to look right,");
System.out.println("At you baby");
System.out.println("but here's my member " + _member);
System.out.println("So, call me maybe?");
}
};
Thread thread = new Thread(runnable, "Carly Rae Jepsen");
thread.Start();
}
}

כפי שאנחנו רואים, בעצם מימשנו ממשק בתוך הפונקציה, ואנחנו מחזיקים Instance של הממשק, אותו אנחנו יכולים להעביר לאן שאנחנו רוצים.

כאן בדוגמה, אנחנו רואים שהעברנו אותו לThread של Java.

שימו לב שלמחלקה הפנימית הזאת יש גישה לכל המשתנים של הפונקציה ולכל הMemberים של המחלקה, שזה ממש מגניב J

מצד שני, זה קצת מוזר – אם כבר אנחנו כותבים מספר מתודות ארוכות למחלקה, למה שלא נכתוב מחלקה רגילה וזהו?

למרות שאפשר להנות מהClosures בצורה יחסית נוחה. (כמו בAnonymous Delegates בC#, ראו גם טיפ 44)

המשך יום אנונימי עם קפה שחור טוב.

שתף