39
39
import rx .util .functions .Func0 ;
40
40
import rx .util .functions .Func1 ;
41
41
42
- public class DefaultSubject <T > extends Subject <T , T > {
43
- public static <T > DefaultSubject <T > create () {
42
+ /**
43
+ * Subject that publishes a single event to each {@link Observer} that has subscribed.
44
+ * <p>
45
+ * Example usage:
46
+ * <p>
47
+ * <pre> {@code
48
+
49
+ PublishSubject<Object> subject = PublishSubject.create();
50
+ // observer1 will receive all onNext events
51
+ subject.subscribe(observer1);
52
+ subject.onNext("one");
53
+ subject.onNext("two");
54
+ // observer2 will only receive "three" and onCompleted
55
+ subject.subscribe(observer2);
56
+ subject.onNext("three");
57
+ subject.onCompleted();
58
+
59
+ } </pre>
60
+ *
61
+ * @param <T>
62
+ */
63
+ public class PublishSubject <T > extends Subject <T , T > {
64
+ public static <T > PublishSubject <T > create () {
44
65
final ConcurrentHashMap <Subscription , Observer <T >> observers = new ConcurrentHashMap <Subscription , Observer <T >>();
45
66
46
67
Func1 <Observer <T >, Subscription > onSubscribe = new Func1 <Observer <T >, Subscription >() {
@@ -62,12 +83,12 @@ public void unsubscribe() {
62
83
}
63
84
};
64
85
65
- return new DefaultSubject <T >(onSubscribe , observers );
86
+ return new PublishSubject <T >(onSubscribe , observers );
66
87
}
67
88
68
89
private final ConcurrentHashMap <Subscription , Observer <T >> observers ;
69
90
70
- protected DefaultSubject (Func1 <Observer <T >, Subscription > onSubscribe , ConcurrentHashMap <Subscription , Observer <T >> observers ) {
91
+ protected PublishSubject (Func1 <Observer <T >, Subscription > onSubscribe , ConcurrentHashMap <Subscription , Observer <T >> observers ) {
71
92
super (onSubscribe );
72
93
this .observers = observers ;
73
94
}
@@ -96,7 +117,7 @@ public void onNext(T args) {
96
117
public static class UnitTest {
97
118
@ Test
98
119
public void test () {
99
- DefaultSubject <Integer > subject = DefaultSubject .create ();
120
+ PublishSubject <Integer > subject = PublishSubject .create ();
100
121
final AtomicReference <List <Notification <String >>> actualRef = new AtomicReference <List <Notification <String >>>();
101
122
102
123
Observable <List <Notification <Integer >>> wNotificationsList = subject .materialize ().toList ();
@@ -147,7 +168,7 @@ public void unsubscribe() {
147
168
148
169
@ Test
149
170
public void testCompleted () {
150
- DefaultSubject <Object > subject = DefaultSubject .create ();
171
+ PublishSubject <Object > subject = PublishSubject .create ();
151
172
152
173
@ SuppressWarnings ("unchecked" )
153
174
Observer <String > aObserver = mock (Observer .class );
@@ -188,7 +209,7 @@ private void assertNeverObserver(Observer<String> aObserver)
188
209
189
210
@ Test
190
211
public void testError () {
191
- DefaultSubject <Object > subject = DefaultSubject .create ();
212
+ PublishSubject <Object > subject = PublishSubject .create ();
192
213
193
214
@ SuppressWarnings ("unchecked" )
194
215
Observer <String > aObserver = mock (Observer .class );
@@ -222,7 +243,7 @@ private void assertErrorObserver(Observer<String> aObserver)
222
243
223
244
@ Test
224
245
public void testSubscribeMidSequence () {
225
- DefaultSubject <Object > subject = DefaultSubject .create ();
246
+ PublishSubject <Object > subject = PublishSubject .create ();
226
247
227
248
@ SuppressWarnings ("unchecked" )
228
249
Observer <String > aObserver = mock (Observer .class );
@@ -255,7 +276,7 @@ private void assertCompletedStartingWithThreeObserver(Observer<String> aObserver
255
276
256
277
@ Test
257
278
public void testUnsubscribeFirstObserver () {
258
- DefaultSubject <Object > subject = DefaultSubject .create ();
279
+ PublishSubject <Object > subject = PublishSubject .create ();
259
280
260
281
@ SuppressWarnings ("unchecked" )
261
282
Observer <String > aObserver = mock (Observer .class );
@@ -290,31 +311,31 @@ private void assertObservedUntilTwo(Observer<String> aObserver)
290
311
@ Test
291
312
public void testUnsubscribe ()
292
313
{
293
- UnsubscribeTester .test (new Func0 <DefaultSubject <Object >>()
314
+ UnsubscribeTester .test (new Func0 <PublishSubject <Object >>()
294
315
{
295
316
@ Override
296
- public DefaultSubject <Object > call ()
317
+ public PublishSubject <Object > call ()
297
318
{
298
- return DefaultSubject .create ();
319
+ return PublishSubject .create ();
299
320
}
300
- }, new Action1 <DefaultSubject <Object >>()
321
+ }, new Action1 <PublishSubject <Object >>()
301
322
{
302
323
@ Override
303
- public void call (DefaultSubject <Object > DefaultSubject )
324
+ public void call (PublishSubject <Object > DefaultSubject )
304
325
{
305
326
DefaultSubject .onCompleted ();
306
327
}
307
- }, new Action1 <DefaultSubject <Object >>()
328
+ }, new Action1 <PublishSubject <Object >>()
308
329
{
309
330
@ Override
310
- public void call (DefaultSubject <Object > DefaultSubject )
331
+ public void call (PublishSubject <Object > DefaultSubject )
311
332
{
312
333
DefaultSubject .onError (new Exception ());
313
334
}
314
- }, new Action1 <DefaultSubject <Object >>()
335
+ }, new Action1 <PublishSubject <Object >>()
315
336
{
316
337
@ Override
317
- public void call (DefaultSubject <Object > DefaultSubject )
338
+ public void call (PublishSubject <Object > DefaultSubject )
318
339
{
319
340
DefaultSubject .onNext ("one" );
320
341
}
0 commit comments