Avatar billede langkiller Nybegynder
03. april 2013 - 22:49 Der er 10 kommentarer og
1 løsning

brug af getters/setters mellem flere klasser

Har valgt at gøre brug af getters og setters i et lille projekt jeg er igang med, men løb ind i et problem da jeg skulle fanger data fra en anden klasse end den der havde "sat" den.

Har cuttet lidt ned i min kode så der ikke er så meget at kigge på.

her er mine getters og setters:

public class ServerRegister {

    private int portNr;
   
    public void setPortNr(int port) {
        this.portNr = port;
    }
   
    public int getPortNr() {
        return portNr;
    }
}


Problemet er dette:
Jeg kalder min setter "setPortNr" og giver den en værdi således:

ServerRegister serverReg = new ServerRegister();
serverReg.setPortNr(getPortNr);


her bliver setteren kaldt og værdien bliver også korrekt "sat".

Fra min anden klasse gør jeg så det samme for at hente denne værdi ud igen:
ServerRegister serverReg = new ServerRegister();
serverReg.getPortNr();

hvilket bare returnerer "0".


Jeg tror godt jeg ved hvorfor den gør dette, men ved ikke hvordan det skal løses.
Går ud fra det skyldes at jeg skriver new ServerRegister(); flere gange og dermed laver et nyt objekt igen og giver getters/setters deres standard værdier tilbage.. men ved ikke hvordan jeg ellers skal gøre det. Håber det er til at forså og nogen kan hjælpe.
Avatar billede langkiller Nybegynder
03. april 2013 - 23:09 #1
har også prøvet med "extends ServerRegister " fra den anden klasse hvilket stadig returnerer "0"..

har også tjekket at værdien bliver sat i ServerRegister ved at udskrive derinde fra. kan simpelthen ikke gennemskue problemet
Avatar billede langkiller Nybegynder
03. april 2013 - 23:12 #2
har også prøvet ,fra den første klasse hvor værdien bliver sat med setter, at skrive "System.out.println(""+ serverReg.getPortNr());" hvilket godt kan returnere det korrekte. Det er først når jeg kalder min getter fra en anden klasse det går galt
Avatar billede langkiller Nybegynder
03. april 2013 - 23:15 #3
okay.. problemet er løst.. er bare bange for at det er en lappeløsning.. har sendt objektet serverReg med over til den anden klasse som atribut. Er det en dum løsning eller ?
Avatar billede arne_v Ekspert
03. april 2013 - 23:57 #4
Nej.

Hvis du skal bruge samme objekt saa skal du have en ref til samme objekt alle steder.

At sende det med over som argument eller saette det som property er helt normalt.

Alternativet kan i nogle tilfaelde vaere singleton.
Avatar billede langkiller Nybegynder
04. april 2013 - 09:39 #5
Når man bruger singleton, initialiserer man kun objekter en enkelt gang og tilgår det fra forskellige klasser ikke? Hvordan fungerer det? er det ved at sende dem rundt som argumenter eller er det via. nedarvning?

du kan bare smide et svar hvis du vil have points.
Avatar billede arne_v Ekspert
04. april 2013 - 15:46 #6

public class Normal {
    public void doSomething(Foobar fb) {
        System.out.println(fb.getV());
    }
    public static void main(String[] args) {
        Foobar fb = new Foobar();
        fb.setV(123);
        Normal o = new Normal();
        o.doSomething(fb);
    }
}

class Foobar {
    private int v;
    public void setV(int v) {
        this.v = v;
    }
    public int getV() {
        return v;
    }
}


vs


public class WithSingleton {
    public void doSomething() {
        System.out.println(FoobarSingleton.getInstance().getV());
    }
    public static void main(String[] args) {
        FoobarSingleton.getInstance().setV(123);
        WithSingleton o = new WithSingleton();
        o.doSomething();
    }
}

class FoobarSingleton {
    private static FoobarSingleton instance = null;
    private FoobarSingleton() {
    }
    public static synchronized FoobarSingleton getInstance() {
        if(instance == null) {
            instance = new FoobarSingleton();
        }
        return instance;
    }
    private int v;
    public void setV(int v) {
        this.v = v;
    }
    public int getV() {
        return v;
    }
}


Du skal kun bruge singleton hvis du absolut har brug for det.

Singleton kan goere det meget svaert at foelge flowet i koden.
Avatar billede arne_v Ekspert
04. april 2013 - 15:46 #7
og et svar
Avatar billede langkiller Nybegynder
04. april 2013 - 18:17 #8
Super, tak for hjælpen :)
Kan du svare mig på noget anden mht. server og client nu vi er igang?

Har en client der opretter sig til en given ip ( 127.0.0.1) til serveren. på denne måde og skriver samtidig til serveren:

clientSocket = new Socket(ipAdresse, portNr);   
           
outToServer = new DataOutputStream(clientSocket.getOutputStream());             outToServer.writeBytes(navn);   
outToServer.writeBytes(alder);


I min server gør jeg således ( i en tråd):
System.out.println("venter");
                    Socket connectionSocket = serverSocket.accept();
                    System.out.println("Fik forbindelse!");
                    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

                    System.out.println("hejhej" + inFromClient.readLine());


Jeg modtager bare ingenting åbenbart. Den udskriver i hvert fald ikke min "syso". Det mærkelige er at den slet ikke skrive noget af det, heller ikke "hejhej".. men hvis jeg laver en syso kun med tekst, så udskriver den det gerne. Jeg gør et eller andet galt ved den forbindelse mellem server og client..
Avatar billede langkiller Nybegynder
04. april 2013 - 18:59 #9
serverSocket.accept(); virker, da programmet kommer videre når client bliver forbundet, men den der readline gider altså ikke udskrive noget :/
Avatar billede langkiller Nybegynder
04. april 2013 - 20:14 #10
lige meget har selv løst det ved at bruger printwriter og println
Avatar billede arne_v Ekspert
04. april 2013 - 22:44 #11
tekst:

PrintWriter - BufferedReader

binaert:

OutputStream - InputStream

stort set aldrig:

DataOutputStream - DataInputStream
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester