Avatar billede jespersahner Nybegynder
26. august 2005 - 15:33 Der er 11 kommentarer og
1 løsning

Returnere flere objekter fra metode-kald

Dette er egentlig et design-spm. I mange tilfælde kan man have brug for, at en metode kunne returnere flere objekter. Jeg har f.eks. en metode, der foretager dynamisk class-loading, hvor jeg ønsker at returnere et objekt af den load'ede klasse samt et String-objekt indeholdede en eventuel fejltekst.

Umiddelbart kan en metode kun returnere et objekt, så jeg er vel nødt til at lave en hjælper-klasse, der pakker de to objekter sammen?
Avatar billede arne_v Ekspert
26. august 2005 - 15:37 #1
en metode kan kun returnere et objekt

så du må enten pakke de flere objekter ned i et container objekt

eller være kreativ

i det konkrete tilfælde kunne du jo droppe at returnere fejl tekst og
smide en exception i tilfælde af fejl

ellers kan du også nogen gange sende objekter med over som argument
og så modificere de objekter i metoden

det sidste er dog ikke altid så pænt
Avatar billede kalp Novice
26. august 2005 - 15:40 #2
Returner det i fx. en ArrayList..

men ellers har Arne_v jo allerede svaret..

Du kan også gøre det rekursivt?
Avatar billede jespersahner Nybegynder
26. august 2005 - 15:48 #3
Jeg er selvfølgelig enig med jer begge.

Der kan dog godt undertiden komme lige meget "fedt på koden", fordi man er nødt til at oprette hjælperklasser, der pakker flere objekter ind.

At returnere i ArrayList er jeg lidt imod, da ArrayList kan indeholde vilkårlige (type og antal) objekter med efterfølgende cast's til følge.

Er der egentlig nogen god grund til, at man har fravalgt mulighed for at returnere flere objekter?
Avatar billede arne_v Ekspert
26. august 2005 - 15:50 #4
ArrayList er ikke specielt type safe (hvilket understreges af ændringerne i 1.5)

jeg kender ingen sprog hvor en metode kan returnere flere objekter
Avatar billede jespersahner Nybegynder
26. august 2005 - 16:09 #5
->arne_v: Ja, omkring 1.5. Betyder dette nye med Generics i 1.5 egentlig, at programmer kører hurtigere, fordi der ikke cast'es på run-time (ClassCastException)?

Men tanken omkring at returnere flere objekter er vel umiddelbart nærliggende, når en metode kan tage flere objekter som argument. Her kunne man jo også have krævet at flere objekter skulle pakkes ind til ét argument. (der er sikkert noget jeg overser :-))
Avatar billede arne_v Ekspert
26. august 2005 - 16:12 #6
et successfuldt cast koster meget lidt på runtime

(en ClassCastException er dyr)

det er for type sikkerheden at man har indført det
Avatar billede jespersahner Nybegynder
26. august 2005 - 16:14 #7
->arne_v: Smid lige et svar.
Avatar billede arne_v Ekspert
26. august 2005 - 16:14 #8
jeg tror der er flere grunde

1)  syntax

int a,double b,String c = o.multireturner();

ser lidt fjollet ud.

2)  tradition

native sprog returnerer normalt funktions resultat i et bestemt register
(som der altså kun er en af)
Avatar billede arne_v Ekspert
26. august 2005 - 16:15 #9
svar
Avatar billede jespersahner Nybegynder
26. august 2005 - 16:43 #10
-> arne_v: Men f.eks.

1) (int,double,String)(a,b,c) = o.multireturner();

ser da meget godt ud :-)
Avatar billede arne_v Ekspert
26. august 2005 - 17:41 #11
du kan jo foreslå det til Java 6

men bliv ikke overrasket over hvis det ikke går igennem

:-)
Avatar billede arne_v Ekspert
26. august 2005 - 17:42 #12
jeg har iøvrigt et lidt tilsvarende ønske (som måske endda er lidt pænere):

switch(a,b) {
  case 1,1:
      ...
      break;
  case 1,2:
      ...
      break;
  case 2,1:
      ...
      break;
  case 2,2:
      ...
      break;
}
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