Hur kan klass B uppdatera fälten i klass A helt automatiskt? - Statiska fält i Java?

Permalänk

Hur kan klass B uppdatera fälten i klass A helt automatiskt? - Statiska fält i Java?

Hej!

Jag bygger webbapplikationer med Raspberry Pi + Java för att styra GPIO pinnarna. Då använder jag Java Server Faces med Primefaces och Tomcat samt Pi4J biblioteket, för att skapa ett grafiskt gränssnitt för att styra lampor, relän, givare osv. Fungerar kanon!

Fungerar bra, men jag har en liten fundering.

Jag har två klasser:
Notera att metoden getNumber() MÅSTE vara inkluderad i klassen A för att jag har en .xhtml fil som läser fältet number och då kräver den getNumber() också. Annars kan hemsidan inte läsa från fältet number i klassen A.

Om ni undrar så ser det ut så här: https://www.primefaces.org/showcase/ui/ajax/counter.xhtml

@Managebean @SessionScoped public class A { private int number; private B b; // Konstruktör public A (B b){ this.b = b; } // Hämta nummer public void getNumber() { number = b.getNumber(); } }

Klass B har en lyssnare som lyssnar utav en händelse. För varje gång en händelse sker så uppdateras number i klass B.

public class B { private int number; public void numberListen(){ // Kod för nummerlyssnare som ökar number++ vid en händelse } // Skicka nummer public int getNumber(){ return number; } }

Problemet är att fältvariabeln number i klass A uppdateras ej automatiskt. Måste jag göra så att number i klass A och klass B delar samma minne, dvs att number ska vara ett statiskt fält. Eller kan jag undvika detta?

Eller en lyssnare för HTML som kan uppdatera ett fält på hemsidan när den känner för det?

Permalänk
Medlem

@heretic16:
Vad är det för syfte med klass A och B?
Det låter ju som att du bara borde köra med exempelvis klass A.

Du kan ju ha en referens till klasserna så att klass A uppdaterar B och vice-versa. Men om det är exakt samma siffra som ska vara i båda klasserna så känns det återigen som att det bara är en klass du ska använda.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Skrivet av Leedow:

@heretic16:
Vad är det för syfte med klass A och B?
Det låter ju som att du bara borde köra med exempelvis klass A.

Du kan ju ha en referens till klasserna så att klass A uppdaterar B och vice-versa. Men om det är exakt samma siffra som ska vara i båda klasserna så känns det återigen som att det bara är en klass du ska använda.

Egentligen så ser det ut så här nu. Jag har klassen Counter som delar en statisk offentlig variabel till klassen RaspberryPi och för varje gång RaspberryPi's lyssnare gör en händelse, så uppdateras fältet number i klassen Counter.

Är det god erfarenhet att sätta ett fält offentligt om man vill dela med fältet till en annan klass och fältet ska ha samma adress?

package se.danielmartensson.web; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean @SessionScoped public class Counter { public static int number; public Counter() { } public int getNumber() { return number; } public void reset() { number = 0; } }

och

package se.danielmartensson.web; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalInput; import com.pi4j.io.gpio.GpioPinDigitalOutput; import com.pi4j.io.gpio.PinPullResistance; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.RaspiPin; import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent; import com.pi4j.io.gpio.event.GpioPinListenerDigital; public class RaspberryPi { private GpioPinDigitalInput pinButton; public RaspberryPi() { // create gpio controller GpioController gpio = GpioFactory.getInstance(); // provision gpio pin #16 as an input pin pinButton = gpio.provisionDigitalInputPin(RaspiPin.GPIO_16, PinPullResistance.PULL_DOWN); pinButton.setShutdownOptions(true); // init listener for the button initButtonListener(); // Reset number Counter.number = 0; } public void initButtonListener() { pinButton.addListener(new GpioPinListenerDigital() { @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) { Counter.number++; } }); } }

Permalänk

Tycker ni att jag ska undvika statiskt fält så gott som det går?

Permalänk
Medlem

Du kanske kan göra din Counter till en singleton så slipper du statiska fält men kan samtidigt uppdatera samma instans av counter.