Jak utworzyć nowy obiekt dla referencji przekazanej jako argument metody?

Odpowiedz Nowy wątek
2014-05-06 22:23
0

Chodzi o to, że pewnej metodzie m przekazuje referencję a do obieku A i chciałbym wewnątrz tej metody do referencji a przypisać nowy obiekt. Niestety zdaje się, że java jako argument dla metod tworzy nową referencję do obiektu w związku z czym zapis (wewnątrz metody) a = new A nic mi nie daje ponieważ nowy obiekt zostaje przypisany do tej lokalnej referencji a nie oryginalnej. Da się to jakoś obejść ?


edytowany 1x, ostatnio: Qbisiek, 2014-05-06 22:24

Pozostało 580 znaków

2014-05-06 22:25
0

Zwracaj obiekty z funkcji zamiast tworzyc jakas patologie.

Pozostało 580 znaków

2014-05-07 09:51
mućka
2

To jest Java, tutaj tak sie nie da - wszystko jest przekazywane przez wartosc, czyli robiona jest kopia. Jak przekazujesz prymitywy, robiona jest kopia wartosci; jak przekazujesz referencje do obiektow, robiona jest kopia tej referencji. Z ta wiedza mozna wywniskowac, ze jesli przypiszesz cos nowego w metodzie, to zmienisz tylko kopie, oryginal pozostaje bez zmian.
Jesli koniecznie chcesz dokonac to o czym piszesz, musisz uzyc pewnego triku i zasymulowac przekazywanie przez referencje - musisz zrobic wrappera ktory w sobie ma referencje do obiekty przekazywanego do metody, i w metodzie zmienic ta referencje. Ale lepiej tak nie rob, zwroc nowa referencje jako wartosc metody.

Pozostało 580 znaków

2014-05-07 10:10

Najprostszą opcją byłoby po prostu przekazywanie mutowalnej Listy - wtedy można przez nią zwracać wyniki. Ale jeśli zwracasz jeden obiekt to zrób sobie klasę implementującą mutowalną listę maksymalnie jednoelementową.

PS:
Tak jak koledzy sugerują wyżej - używaj tylko gdy musisz, bo to krzywy hack.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2014-05-07 15:59
0

Ok, dzięki za rady :)


edytowany 1x, ostatnio: Qbisiek, 2014-05-07 17:22

Pozostało 580 znaków

2014-05-07 16:45
mućka
0
Wibowit napisał(a):

Najprostszą opcją byłoby po prostu przekazywanie mutowalnej Listy - wtedy można przez nią zwracać wyniki. Ale jeśli zwracasz jeden obiekt to zrób sobie klasę implementującą mutowalną listę maksymalnie jednoelementową.

PS:
Tak jak koledzy sugerują wyżej - używaj tylko gdy musisz, bo to krzywy hack.

Najprosztsza opcja jest zdecydowanie przekazywanie jednoelementowej tablicy, tak mi sie wydaje.

Pozostało 580 znaków

2014-05-07 17:02
0

Javowcem nie jest, ale dla mnie przekazywanie listy jako argument, gdy wiem, ze tam bedzie tylko 1 obiekt, to jest bardzo mylacy pomysl. IMO duzo sensowniej by bylo sobie zrobic wrappera na obiekt Ref<T> i tak przekazywac, przynajmniej bedzie wiadomo o co chodzi czytajac sygnature metody.

Pozostało 580 znaków

2014-05-07 17:09
mućka
0

Totez napisalem wczesniej o wrapperze, jak najbardziej moze byc generyczny. Vibovitowi chodzilo chyba o to ze pomysl z lista / tablica jest najlatwiejszy bo nie trzeba tworzyc zadnych dodatkowych klas.

Niedoczytalem do konca, moj blad :P - n0name_l 2014-05-07 17:10

Pozostało 580 znaków

2014-05-08 11:02
niezalogowany
0

Nie trzeba nic w kodzie zmieniać, trzeba zmienić sposób myślenia. Co chcesz osiągnąć? Dziwią mnie konstruktywne odpowiedzi, samo pytanie nie ma zbyt wielkiego sensu.

Jest tak dlatego, że nie podałem kontekstu, ale możesz wierzyć mi na słowo, że w tym, moim, konkretnym przypadku właśnie takie wyjście jakie opisałem zdaje się najbardziej naturalne. - Qbisiek 2014-05-08 23:16

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0