Similar presentations:
Вложенные классы и перечисления. Локальные и анонимные классы
1.
2.
VIII. Вложенные классы иперечисления
3. Локальные и анонимные классы
2
3. Локальные классы
Локальный класс – внутренний класс объявленный внутри блока кода, такого как телометода, конструктор или блок инициализации. Локальный класс не является членом
класса, к которому относится блок, а принадлежит самому блоку. Локальные классы
недоступны за пределами блока. Единственный модификатор который можно к ним
применять это модификатор final запрещающий наследование.
3
4. Локальный компаратор
publicpublic class
class LocalComparatorDemo
LocalComparatorDemo {{
public
public static
static void
void main(String
main(String args[])
args[]) {{
List<String>
List<String> produce
produce == new
new ArrayList<String>();
ArrayList<String>();
produce.add("Orange");
produce.add("Orange");
produce.add("Grapes");
produce.add("Grapes");
produce.add("Banana");
produce.add("Banana");
produce.add("Apple");
produce.add("Apple");
produce.add("Watermelon");
produce.add("Watermelon");
produce.add("Kiwi");
produce.add("Kiwi");
produce.add("Melon");
produce.add("Melon");
System.out.println(produce);
System.out.println(produce);
System.out.println("Sorting
System.out.println("Sorting in
in reverse
reverse order...");
order...");
class
class ReverseComparator
ReverseComparator implements
implements Comparator<String>
Comparator<String> {{
public
public int
int compare(String
compare(String s1,
s1, String
String s2)
s2) {{
return
return s2.compareTo(s1);
s2.compareTo(s1);
}}
}}
}}
}}
Collections.sort(produce,
Collections.sort(produce, new
new ReverseComparator());
ReverseComparator());
System.out.println(produce);
System.out.println(produce);
[Orange,
[Orange, Grapes,
Grapes, Banana,
Banana, Apple,
Apple, Watermelon,
Watermelon, Kiwi,
Kiwi, Melon]
Melon]
Sorting
Sorting in
in reverse
reverse order...
order...
[Watermelon,
[Watermelon, Orange,
Orange, Melon,
Melon, Kiwi,
Kiwi, Grapes,
Grapes, Banana,
Banana, Apple]
Apple]
4
5. Локальный итератор
classclass LocalStringList
LocalStringList implements
implements Iterable<String>
Iterable<String> {{
private
private
private
private
String[]
String[] strings
strings == new
new String[100];
String[100];
int
size;
int size;
public
public void
void add(String
add(String string)
string) {{
strings[size++]
strings[size++] == string;
string;
}}
public
public Iterator<String>
Iterator<String> iterator()
iterator() {{
class
class LocalIterator
LocalIterator implements
implements Iterator<String>
Iterator<String> {{
private
private int
int position
position == 0;
0;
public
public String
String next()
next() {{
return
return strings[position++];
strings[position++];
}}
public
public boolean
boolean hasNext()
hasNext() {{
return
return position
position << size;
size;
}}
public
public void
void remove()
remove() {{
throw
throw new
new UnsupportedOperationException();
UnsupportedOperationException();
}}
}}
}}
}}
return
return new
new LocalIterator();
LocalIterator();
5
6. Локальный итератор
publicpublic class
class LocalIteratorDemo
LocalIteratorDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
LocalStringList
LocalStringList list
list == new
new LocalStringList();
LocalStringList();
list.add("Harry
list.add("Harry Hacker");
Hacker");
list.add("Tony
list.add("Tony Tester");
Tester");
list.add("Cindy
list.add("Cindy Coder");
Coder");
Iterator<String>
Iterator<String> iter
iter == list.iterator();
list.iterator();
}}
}}
while
while (iter.hasNext())
(iter.hasNext()) {{
System.out.println(iter.next());
System.out.println(iter.next());
}}
Harry
Harry Hacker
Hacker
Tony
Tony Tester
Tester
Cindy
Cindy Coder
Coder
6
7.
Анонимные классы7
8. Анонимные классы
Анонимный класс – локальный класс без имени. Анонимный класс является подклассомсуществующего класса или реализацией интерфейса. Нельзя создавать ссылочные
переменные типа анонимного класса. Для хранения ссылки на объект анонимного
класса необходимо использовать ссылку на базовый класс или реализуемый
интерфейс. Использование анонимных классов оправдано во многих случаях, в
частности когда: тело класса является очень коротким; нужен только один экземпляр
класса; класс используется в месте его создания или сразу после него; имя класса не
важно и не облегчает понимание кода.
8
9. Анонимный компаратор
publicpublic class
class AnonymousComparator
AnonymousComparator {{
public
public static
static void
void main(String
main(String args[])
args[]) {{
List<String>
List<String> list
list == new
new ArrayList<String>();
ArrayList<String>();
list.add("Harry
list.add("Harry Hacker");
Hacker");
list.add("Tony
list.add("Tony Tester");
Tester");
list.add("Alice
list.add("Alice Coder");
Coder");
System.out.println(list);
System.out.println(list);
Collections.sort(list);
Collections.sort(list);
System.out.println(list);
System.out.println(list);
Collections.sort(list,
Collections.sort(list, new
new Comparator<String>()
Comparator<String>() {{
public
public int
int compare(String
compare(String s1,
s1, String
String s2)
s2) {{
return
return s2.compareTo(s1);
s2.compareTo(s1);
}}
});
});
}}
}}
System.out.println(list);
System.out.println(list);
[Harry
[Harry Hacker,
Hacker, Tony
Tony
[Alice
[Alice Coder,
Coder, Harry
Harry
[Tony
[Tony Tester,
Tester, Harry
Harry
Tester,
Tester,
Hacker,
Hacker,
Hacker,
Hacker,
Alice
Alice Coder]
Coder]
Tony
Tony Tester]
Tester]
Alice
Alice Coder]
Coder]
9
10. Анонимный итератор
classclass AnonymousStringList
AnonymousStringList implements
implements Iterable<String>
Iterable<String> {{
private
private
private
private
String[]
String[] strings
strings == new
new String[100];
String[100];
int
size;
int size;
public
public void
void add(String
add(String string)
string) {{
strings[size++]
strings[size++] == string;
string;
}}
public
public Iterator<String>
Iterator<String> iterator()
iterator() {{
return
return new
new Iterator<String>()
Iterator<String>() {{
private
private int
int position
position == 0;
0;
public
public String
String next()
next() {{
return
return strings[position++];
strings[position++];
}}
public
public boolean
boolean hasNext()
hasNext() {{
return
return position
position << size;
size;
}}
}}
}}
};
};
public
public void
void remove()
remove() {{
throw
throw new
new UnsupportedOperationException();
UnsupportedOperationException();
}}
10
11. Анонимный итератор
publicpublic class
class AnonymousIteratorDemo
AnonymousIteratorDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
AnonymousStringList
AnonymousStringList list
list == new
new AnonymousStringList();
AnonymousStringList();
list.add("Harry
list.add("Harry Hacker");
Hacker");
list.add("Tony
list.add("Tony Tester");
Tester");
list.add("Cindy
list.add("Cindy Coder");
Coder");
Iterator<String>
Iterator<String> iter
iter == list.iterator();
list.iterator();
}}
}}
while
while (iter.hasNext())
(iter.hasNext()) {{
System.out.println(iter.next());
System.out.println(iter.next());
}}
Harry
Harry Hacker
Hacker
Tony
Tony Tester
Tester
Cindy
Cindy Coder
Coder
11
12. Уникальность объявления анонимных классов
Каждое объявление анонимного класса уникально. Для каждогообъвленного анонимного класса создаётся отдельный класс. Когда
создаются class файлы для анонимных классов обычно названия
файлов Class$1.class, Class$2.class, … где Class название внешнего
класса. Но полагаться на такое именование анонимных классов не
следует.
12
13. Несколько анонимных классов
importimport java.util.Comparator;
java.util.Comparator;
public
public class
class ManyAnonymousDemo
ManyAnonymousDemo {{
interface
interface Greeter
Greeter {{
public
public void
void greet(String
greet(String name);
name);
}}
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Greeter
Greeter firstGreeter
firstGreeter == new
new Greeter()
Greeter() {{
};
};
public
public void
void greet(String
greet(String name)
name) {{
System.out.println("Hello
System.out.println("Hello "" ++ name);
name);
}}
Greeter
Greeter secondGreeter
secondGreeter == new
new Greeter()
Greeter() {{
};
};
}}
}}
public
public void
void greet(String
greet(String name)
name) {{
System.out.println("Hello
System.out.println("Hello "" ++ name);
name);
}}
firstGreeter.greet("Harry
firstGreeter.greet("Harry Hacker");
Hacker");
secondGreeter.greet("Tony
secondGreeter.greet("Tony Tester");
Tester");
Hello
Hello Harry
Harry Hacker
Hacker
Hello
Hello Tony
Tony Tester
Tester
13
14. Class файлы для анонимных классов
1415. Анонимные классы и полиморфизм
При использовании анонимных классов можно вызывать толькометоды которые объявлены в базовом классе или реализуемом
интерфейсе. Таким образом как и для обычных классов методы
которые можно вызывать определяются типом ссылки.
15
16.
Анонимные классы и конструкторы16
17. Вызов конструктора базового класса
Основное ограничение при использовании анонимных классов - это невозможностьописания конструктора, так как класс не имеет имени. Аргументы, указанные в скобках,
автоматически используются для вызова конструктора базового класса с теми же
параметрами.
17
18. Вызов конструктора базового класса
publicpublic class
class BaseConstructorDemo
BaseConstructorDemo {{
static
static abstract
abstract class
class Greeter
Greeter {{
private
private String
String greeting;
greeting;
public
public Greeter(String
Greeter(String greeting)
greeting) {{
this.greeting
this.greeting == greeting;
greeting;
}}
}}
public
public void
void greet(String
greet(String name)
name) {{
System.out.println(greeting
System.out.println(greeting ++ "" "" ++ name);
name);
}}
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Greeter
Greeter doubleEnglishGreeter
doubleEnglishGreeter == new
new Greeter("Hello")
Greeter("Hello") {{
};
};
public
public void
void greet(String
greet(String name)
name) {{
super.greet(name);
super.greet(name);
super.greet(name);
super.greet(name);
}}
Greeter
Greeter tripleFrenchGreeter
tripleFrenchGreeter == new
new Greeter("Salut")
Greeter("Salut") {{
};
};
}}
}}
public
public void
void greet(String
greet(String name)
name) {{
super.greet(name);
super.greet(name);
super.greet(name);
super.greet(name);
super.greet(name);
super.greet(name);
}}
doubleEnglishGreeter.greet("Harry
doubleEnglishGreeter.greet("Harry Hacker");
Hacker");
tripleFrenchGreeter.greet("Tonny
Tester");
tripleFrenchGreeter.greet("Tonny Tester");
18
19. Вызов конструктора базового класса
HelloHello
Hello
Hello
Salut
Salut
Salut
Salut
Salut
Salut
Harry
Harry
Harry
Harry
Tonny
Tonny
Tonny
Tonny
Tonny
Tonny
Hacker
Hacker
Hacker
Hacker
Tester
Tester
Tester
Tester
Tester
Tester
19
20.
21. Class файлы для анонимных классов
2122. Анонимный компаратор
publicpublic class
class AnonymousThreadDemo
AnonymousThreadDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
}}
}}
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Thread
Thread tt == new
new Thread()
Thread() {{
public
public void
void run()
run() {{
for
for (int
(int ii == 0;
0; ii << 10;
10; i++)
i++) {{
Date
Date now
now == new
new Date();
Date();
System.out.println("Hello
System.out.println("Hello World!
World!
try
try {{
sleep(1000);
sleep(1000);
}} catch
catch (InterruptedException
(InterruptedException e)
e)
e.printStackTrace();
e.printStackTrace();
}}
}}
}}
};
};
t.start();
t.start();
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Thu
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
Jan
03
03
03
03
03
03
03
03
03
03
03
03
03
03
03
03
03
03
03
03
15:35:52
15:35:52
15:35:53
15:35:53
15:35:54
15:35:54
15:35:55
15:35:55
15:35:56
15:35:56
15:35:57
15:35:57
15:35:58
15:35:58
15:35:59
15:35:59
15:36:00
15:36:00
15:36:01
15:36:01
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
GMT+07:00
"" ++ now);
now);
{{
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
2013
22
23. Анонимные классы сделать наблюдатель
Here, we have gone over to the terse side. We've allocated and started a new Thread, usingan
anonymous
inner
class
that
extends
the Thread class
and
invokes
our performBehavior( ) method in its run( ) method. The effect is similar to using a method
pointer in some other language. However, the inner class allows the compiler to check type
consistency, which would be more difficult (or impossible) with a true method pointer. At the
same time, our anonymous adapter class with its three lines of code is much more efficient
and
readable
than
creating
a
new,
top-level
adapter
class
named AnimalBehaviorThreadAdapter.
While we're getting a bit ahead of the story, anonymous adapter classes are a perfect fit for
event handling (which we cover fully in Chapter 16). Skipping a lot of explanation, let's say
you want the method handleClicks( ) to be called whenever the user clicks the mouse. You
would write code such as:
addMouseListener( new MouseInputAdapter( ) { public void mouseClicked(MouseEvent e)
{
handleClicks(e);
}
}
);
In this case, the anonymous class extends the MouseInputAdapter class by overriding
its mouseClicked( ) method to call our method. A lot is going on in a very small space, but the
result is clean, readable code. You assign method names that are meaningful to you while
allowing Java to do its job of type checking.
23
24. Thread
he previous example is a bit extreme and certainly does not improve readability. Inner classesare best used when you want to implement a few lines of code, but the verbiage and
conspicuousness of declaring a separate class detracts from the task at hand. Here's a better
example. Suppose that we want to start a new thread to execute
the performBehavior( ) method of our Animal:
new Thread( ) { public void run( ) { performBehavior( ); } }.start( );
24