فهرست منبع

Add a forwarding observer listener, Collection version of setObserved()

Sam Jaffe 5 سال پیش
والد
کامیت
1ad458be5a

+ 1 - 1
pom.xml

@@ -4,7 +4,7 @@
 
   <groupId>org.leumasjaffe</groupId>
   <artifactId>observer</artifactId>
-  <version>0.3</version>
+  <version>0.4.0</version>
   <packaging>jar</packaging>
 
   <name>observer</name>

+ 20 - 0
src/main/lombok/org/leumasjaffe/observer/ForwardingObservableListener.java

@@ -0,0 +1,20 @@
+package org.leumasjaffe.observer;
+
+/**
+ * @brief A specialization of IndirectObservableListener where we do not support any behavior
+ * internal to the View object, and so simply store a Void/null object as that component. Instead,
+ * this object acts as a forwarder, listening to some number of child Observables and simply
+ * invoking notify on its own observed object.
+ * 
+ * It is incumbent on the programmer to avoid creating recursive observations.
+ * 
+ * @author samjaffe
+ *
+ * @param <T> An observable object that we are not strictly interested in, but is required for
+ * propagating changes up the stack.
+ */
+public class ForwardingObservableListener<T extends Observable> extends IndirectObservableListener<Void, T> {
+	public ForwardingObservableListener() {
+		super(null, (c, t) -> ObserverDispatch.notifySubscribers(t));
+	}
+}

+ 6 - 1
src/main/lombok/org/leumasjaffe/observer/IndirectObservableListener.java

@@ -1,5 +1,6 @@
 package org.leumasjaffe.observer;
 
+import java.util.Collection;
 import java.util.Objects;
 import java.util.function.BiConsumer;
 
@@ -40,10 +41,14 @@ public class IndirectObservableListener<C, T> {
 		// Invoke the update callback - our parent does not need to update the
 		// {@see component} manually.
 		updateComponent( );
-		for ( int i = 0; i < extra.length; ++i ) {
+		for ( int i = 0, n = extra.length; i < n; ++i ) {
 			ObserverDispatch.subscribe( extra[i], this, this::updateComponent );
 		}
 	}
+	
+	public void setObserved( T obs, Collection<? extends Observable> extra ) {
+		setObserved(obs, (Observable[]) extra.toArray());
+	}
 
 	private void updateComponent() {
 		update.accept(component, model);