• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Metody funkcji. Przekazywanie argumentu przez referencje.

VPS Starter Arubacloud
0 głosów
550 wizyt
pytanie zadane 29 grudnia 2018 w Java przez studenciak Nowicjusz (230 p.)
Dzień dobry.
Napisałem funkcję void, do której przekazuję 2 argumenty typu prostego int. Zależy mi na tym aby te dwa przekazywane argumenty były modyfikowane również poza funkcją, tzn. aby funkcja nie operowała na kopiach tych argumentów, ale pracowała na tych samych obszarach pamięci (pracowała na oryginałach). W c++ korzystało się z operatora &, jeśli chcieliśmy modyfikować przekazywane parametry. Czy w javie istnieje również coś takiego? Wiem, że w przypadku parametrów, będących obiektami pracujemy na referencji, natomiast w przypadku typów prostych - na wartości. Czy jest możliwość pracować na pamięci w przypadku typów prostych? Czy trzeba tworzyć osobne obiekty wykorzystujące typy proste i to te obiekty przesyłać do metod?

2 odpowiedzi

0 głosów
odpowiedź 29 grudnia 2018 przez RafalS VIP (122,820 p.)
Da się, ale powinno się unikać.

Możesz użyć jakichś mutowalnych wraperow np:

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html

Albo guava mutableint.

Albo po prostu opakowac w tablice jednoelementowa.

Wszystkie wersje dają funkcjonalność ale są dziwne i nieczytelne. I dobrze :p
komentarz 29 grudnia 2018 przez studenciak Nowicjusz (230 p.)

Dzięki za pomoc. Na stackoverflow znalazłem podobny problem, gdyby ktoś kiedyś jeszcze szukał to: https://stackoverflow.com/questions/3662288/can-i-pass-a-primitive-type-by-reference-in-java

0 głosów
odpowiedź 29 grudnia 2018 przez mbabane Szeryf (79,280 p.)

A co ta funkcja w sumie robi, bo wydaje mi się, że może to ona jest źle przemyślana. Może zamiast robić funkcję z dwoma parametrami zrób do tej funkcjonalności klasę:

public class SomeClass
{
      private int value1;
      private int value2;

     public SomeClass(int value1, int value2)
      {
            this.value1 = value1;
            this.value2 = value2;
       }

     public void process()
     {
        this.value1 = value1 + 10;
        this.value2 = value2 + 20;
     }

      public int getValue1()
     {
          return value1;
     }

      public int getValue2()
     {
          return value2;
     }

}

Zastosowanie:

int val1 = 10;
int val2 = 15;

SomeClass someClass = new SomeClass(val1, val2);
someClass.process();

System.out.println("val1: " + someClass.getValue1());
System.out.println("val2: " + someClass.getValue2());

Ewentualnie jeszcze jakieś bardziej wyszukane i przemyślane refaktoryzacje. Powyższe to jakiś pierwszy etap - wydzielenie klasy.

komentarz 29 grudnia 2018 przez studenciak Nowicjusz (230 p.)
Rozwiązywałem zadanie ze spoja i miałem w rozwiązaniu 2 zmienne typu int: godziny, minuty. Do metod chciałem przekazywać te dwie zmienne typu prostego a z racji, iż jest to zadanie ze spoja, nie chciałem kodu rozbudowywać o dodatkową klasę, z której utworzyłbym tylko jeden obiekt. Ale w takim wypadku utworzyłem klasę Time i tam wpakowałem te dwie zmienne i dorzuciłem metody get oraz set według Twojego przepisu.
komentarz 29 grudnia 2018 przez mbabane Szeryf (79,280 p.)
Nie robiłem za bardzo zadań ze spoja, ale z tego co się orientuje to tam chyba rzadko kiedy  coś się wyodrębnia, nawet do funkcji. Wali się wszystko w jednym mainie.

Normalnie w Javie i tak prawdopodobnie by to JIT zoptymalizował do wywołań inline.

Podobne pytania

0 głosów
1 odpowiedź 313 wizyt
0 głosów
2 odpowiedzi 778 wizyt
pytanie zadane 28 stycznia 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)
0 głosów
2 odpowiedzi 79 wizyt
pytanie zadane 16 listopada 2020 w C i C++ przez arccx Nowicjusz (210 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...