Avatar billede trp79 Nybegynder
19. marts 2003 - 18:40 Der er 15 kommentarer og
1 løsning

Attribut tilgang - oplæg til lidt diskussion

Hvis man nu har en klasse "Run", hvori main metoden ligger og følgende sker:
1)persistent data indlæses i diverse lister.
2) Gui gui = new gui(liste1, liste2,....)

i gui sker følgende:
listerne modtages
GuiInput guiInput = new GuiInput ();

Altså gui er den klasse man arbejder i og guiInput skal kunne tilføje data til listerne i gui klassen.
Hvordan gør man det lettest? Kan man sende hukommelse adressen på listerne med ved oprettelse af GuiInput (det er så ikke så objekt orienteret en tankegang) eller bør man i guiInput lave en metode som returnerer en modificeret liste, eller kan man sende det "this" (guiobjekt) med og direkte modificere det?

I gui bliver alt data altså vist og guiInput kunne fx være en JDialog, som bruges til tilføjelse af data.

Hvordan laver man det pænest i java?
Avatar billede disky Nybegynder
19. marts 2003 - 18:43 #1
Du laver en constructor der modtager listerne med det samme,
GuiInput guiInput = new GuiInput (liste1, liste2);

eller laver nogle set metoder til at overfører referencer med.
Avatar billede arne_v Ekspert
19. marts 2003 - 18:44 #2
Du har ihvertfald 2 muligheder:

1)  sende listerne med over i GuiInput constructor og så kan
    GuiInput's metoder rette i dem direkte

2)  sende en referance til Gui objektet med over i GuiInput
    constructor og så kan GuiInput's metoder kalder metoder
    i Gui der retter i listerne.
Avatar billede trp79 Nybegynder
19. marts 2003 - 18:52 #3
Men når man sender listerne med over i constructoren så kan man jo kun "nå dem" i selve constructoren.

Man vil jo formentlig have noget i denne stil:

import java.io.*
import java.util.*
impo.....

ArrayList list1;
ArrayList list2;

public GuiInput(list1, list2)
{
this.list1=list1;
this.list2=list2;
}
...
Man laver jo denne this for at man kan tilgå listerne i resten af klassen. Men det er jo ikke de lister der er modtaget man retter i så, men lister lokalt i klassen, eller tager jeg helt fejl?

Hvordan arbejder man med referencer?
Avatar billede soreno Praktikant
19. marts 2003 - 18:55 #4
this.list1=list1;
Adressen til objektet "this.list1" sættes lig med adressen til "list1" objektet - altså peger "this.list1" på "list1!.
Dvs. du retter direkte i den oprindelige liste.
Avatar billede arne_v Ekspert
19. marts 2003 - 18:55 #5
Du tager fejl.

Alle objekter i java sendes automatisk over som referancer (pointere i C/C++
termonologi) og du retter i "originalen".

Hvis du vil have en kopi skal du bruge:

this.list1 = (ArrayList)(list1.clone());
Avatar billede trp79 Nybegynder
19. marts 2003 - 19:03 #6
Okey så er det jo herre let!:o)
Lækkert at jeg først har fundet ud af det nu - not...
Nå, men så fik jeg da noget ret basalt på plads :o)
Tak for hjælpen.

Lige for at få noget helt på plads så.... this refererer den aktuelle klasse så (GuiInput objektet), right?

Hvordan skal vi dele pointene.... Arne har jo svaret mest og soreno og disky knapt så meget... Der er godt nok ikke så mange point at slås om, men det skal da være retfærdigt, så hvis soreno lige smider et svar også...
Avatar billede arne_v Ekspert
19. marts 2003 - 19:06 #7
this refererer til objektet selv.
Avatar billede arne_v Ekspert
19. marts 2003 - 19:09 #8
NB: Hvis nogen skulle få lyst til at bruge clone, så husk og nærlæs
dokumentationen / koden for at se om det er an shallow eller deep
clone.

Problemet opstår hvis objektet indeholder referancer til andre objekter.

En shallow clone laver et nyt objekt med referancer til de samme
objekter som originalen.

En deep clone laver også cloner af alle de objekter der er inden i.

Det ene er ikke bedre eller dårligere end det andet. Men det kan
gøre en stor forskel på hvordan ens applikation virker !
Avatar billede soreno Praktikant
19. marts 2003 - 19:09 #9
De gange jeg har lavet noget gui hvor jeg skulle tilgå en datamodel har jeg lavet en "mother-of-all-classes" klasse som jeg sender via en reference i konstruktøren i swing klasserne.

Altså:
private Admin admin;
public MinFrame(Admin admin)
{
  this.admin = admin;
}

Admin klassen har så get/setters til de dele af datamodellen som jeg skal bruge.

F.eks.
Medlemsliste liste = admin.getMedlemsListe();
Avatar billede trp79 Nybegynder
19. marts 2003 - 19:15 #10
Vil det sige at man altid arbejder med referencer i java? For jeg kan da regne ud at det også er det soreno gør i sit seneste svar så. Hvad så hvis man har nogle variabler internt i klasse:
int a=5;
int b=a;
int c=b;
De peger vel alle bare på samme adresse så...
Avatar billede trp79 Nybegynder
19. marts 2003 - 19:16 #11
ups! sorry skulle have trykket på avanceret! Hvad gør jeg?
Avatar billede arne_v Ekspert
19. marts 2003 - 19:20 #12
Nej.

Det er kun objekter - ikke simple datatyper.
Avatar billede trp79 Nybegynder
19. marts 2003 - 19:21 #13
Okey! Skønt at blive lidt klogere!! :o)
Avatar billede arne_v Ekspert
19. marts 2003 - 19:21 #14
int a=5;
int b=a;
int c=b;

er 3 forskellige variable.

MyObject a = new MyObject();
MyObject b = a;
MyObject c = b;

er 3 forskellige referancer til det samme objekt.
Avatar billede trp79 Nybegynder
19. marts 2003 - 20:09 #15
Okey, dvs. at int, float, short, long, char er simple datatyper, hvorimod fx String ikke er.... Tak for hjælpen :o)
Avatar billede arne_v Ekspert
19. marts 2003 - 20:22 #16
Jeps.

Og med hensyn til point, så tror jeg bare at vi siger, at det var
diskys heldige dag.
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