8000 Updated Announcer to use generics · armdev/java-design-patterns@7d490a9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 7d490a9

Browse files
committed
Updated Announcer to use generics
1 parent 03cdfc3 commit 7d490a9

File tree

4 files changed

+19
-12
lines changed

4 files changed

+19
-12
lines changed

proxy/src/main/java/com/iluwatar/proxy/example2/Announcer.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@
33
import java.lang.reflect.InvocationTargetException;
44
import java.lang.reflect.Method;
55
import java.lang.reflect.Proxy;
6+
import java.util.EventListener;
67
import java.util.List;
78
import java.util.concurrent.CopyOnWriteArrayList;
89

9-
public class Announcer {
10+
public class Announcer<T extends EventListener> {
1011

11-
private HealthMonitor proxy;
12-
private List<HealthMonitor> listeners = new CopyOnWriteArrayList<>();
12+
private T proxy;
13+
private List<T> listeners = new CopyOnWriteArrayList<>();
1314

14-
public Announcer(Class<HealthMonitor> listenerType) {
15+
public Announcer(Class<T> listenerType) {
1516
proxy = createProxy(listenerType);
1617
}
1718

18-
private HealthMonitor createProxy(Class<HealthMonitor> listenerType) {
19+
private T createProxy(Class<T> listenerType) {
1920
return listenerType.cast(Proxy.newProxyInstance(listenerType.getClassLoader(),
2021
new Class<?>[] {listenerType}, (proxy, method, args) -> {
2122
invokeAll(method, args);
@@ -24,7 +25,7 @@ private HealthMonitor createProxy(Class<HealthMonitor> listenerType) {
2425
}
2526

2627
private void invokeAll(Method method, Object[] args) {
27-
for (HealthMonitor listener : listeners) {
28+
for (T listener : listeners) {
2829
try {
2930
method.invoke(listener, args);
3031
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
@@ -33,15 +34,19 @@ private void invokeAll(Method method, Object[] args) {
3334
}
3435
}
3536

36-
public void registerListener(HealthMonitor listener) {
37+
public void registerListener(T listener) {
3738
listeners.add(listener);
3839
}
3940

40-
public HealthMonitor announce() {
41+
public T announce() {
4142
return proxy;
4243
}
4344

44-
public void removeListener(HealthMonitor listener) {
45+
public void removeListener(T listener) {
4546
listeners.remove(listener);
4647
}
48+
49+
public static <T extends EventListener> Announcer<T> to(Class<T> listenerType) {
50+
return new Announcer<>(listenerType);
51+
}
4752
}

proxy/src/main/java/com/iluwatar/proxy/example2/EndPoint.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
public class EndPoint {
44

55
private final String name;
6-
private final Announcer healthMonitors = new Announcer(HealthMonitor.class);
6+
private final Announcer<HealthMonitor> healthMonitors = Announcer.to(HealthMonitor.class);
77

88
public EndPoint(String name) {
99
this.name = name;

proxy/src/main/java/com/iluwatar/proxy/example2/HealthMonitor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.iluwatar.proxy.example2;
22

3-
public interface HealthMonitor {
3+
import java.util.EventListener;
4+
5+
public interface HealthMonitor extends EventListener {
46

57
void disconnected(EndPoint endPoint);
68

proxy/src/test/java/com/iluwatar/proxy/example2/AnnouncerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class AnnouncerTest {
1616
private EndPoint endPoint = mock(EndPoint.class);
1717
private HealthMonitor monitor1 = mock(HealthMonitor.class);
1818
private HealthMonitor monitor2 = mock(HealthMonitor.class);
19-
private Announcer announcer = new Announcer(HealthMonitor.class);
19+
private Announcer<HealthMonitor> announcer = Announcer.to(HealthMonitor.class);
2020

2121
@Before
2222
public void setUp() {

0 commit comments

Comments
 (0)
0