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ść ?
Zwracaj obiekty z funkcji zamiast tworzyc jakas patologie.
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.
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.
Ok, dzięki za rady :)
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.
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.
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.
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.