Literały i settery

0

Witma,

Czy istnieje możliwość aby za pomocą metody przypisać inna wartość do literału? Chodzi mi o to aby móc zrobić taki myk że inna metoda przyjmuje mojego integera jako parametr i w środku go modyfikuje.

np.

	void exampleInt() {
		Integer i = new Integer(32);
		System.out.println("I: " + i);
		intInsisde(i);
		System.out.println("I2: " + i);
	}
	
	void intInsisde(Integer i) {
		i = new Integer(100); // jak przypisze z new to mam inna refenrencje
		System.out.println("I w srodku: " + i);
	}
i.

Z góry dzięki za pomoc.

2

Nie ma takiej możliwości. Jedyna możliwość, to zwrócenie nowej wartości i przypisanie jej do poprzedniego odniesienia. Swoją drogą, czemu new Integer, a nie po prostu = 32?

0
Desu napisał(a):

Nie ma takiej możliwości. Jedyna możliwość, to zwrócenie nowej wartości i przypisanie jej do poprzedniego odniesienia. Swoją drogą, czemu new Integer, a nie po prostu = 32?

Tak wiem że można po prostu = 32 :) Czyli jakby co to trzeba wrappować tego integera. Dzięki za odpowiedź.

1

Możesz użyć tablicy nawet jedno-elementej tylko pytanie po co to chcesz zrobić?

0
scibi92 napisał(a):

Możesz użyć tablicy nawet jedno-elementej tylko pytanie po co to chcesz zrobić?

Pytam z czystej ciekawości. Bo to troche dla mnie dziwne że nie można tego zmienić.

0

@vakil: ostatnio o tym pisałem, co prawda w kontekście JavaScript, ale zasada działania ta sama: Odnosnik do obiektu tworzy nowy osobny obiekt?!

void exampleInt() {
    Integer i = new Integer(32); // tworzysz w pamięci nowy obiekt, który ma odniesienie powiedzmy I@abc
    System.out.println("I: " + i);
    intInsisde(i); // przekazujesz tylko odniesienie do obiektu Integer(32), a nie cały obiekt, czyli I@abc
    System.out.println("I2: " + i);
}

void intInsisde(Integer i) { // W tym miejscu pod "i" jest tylko odniesienie (I@abc) do Integer(32), a nie on sam, co więcej jest to kopia tej wartości
    i = new Integer(100); // tutaj nadpisujesz tylko odniesienie innym odniesieniem, a Twój Integer(32) siedzi sobie spokojnie w pamięci i nic mu nie jest
    System.out.println("I w srodku: " + i);
}

(Zdaję sobie sprawę, że wyżej mogłem powalić terminologię, bo nie wiem w 100% jak to działa, więc jak ktoś chce uściślić to zapraszam)

title

0
vakil napisał(a):
scibi92 napisał(a):

Możesz użyć tablicy nawet jedno-elementej tylko pytanie po co to chcesz zrobić?

Pytam z czystej ciekawości. Bo to troche dla mnie dziwne że nie można tego zmienić.

Integery na całe szczęście sa niemutowalne. Nie możesz równiez zmienić referencji przez metodę zewnętrzną tzn:

void foo(Obj o) {
 o = "";
}

o będzie pustym Stringiem tylko wewnątrz metody foo. I całe szczęście :)

1

A prawdziwy powód (którego nikt Ci tutaj nie podał) to konsystencja:

void intInside(Object o) {
  o = new String("tekst");
}
Integer liczba = 32;
intInside(liczba);   // ups, liczba jest teraz typu String
3
scibi92 napisał(a):

Integery na całe szczęście sa niemutowalne. Nie możesz równiez zmienić referencji przez metodę zewnętrzną tzn:

Niemutowalne :-)

    void exampleInt() {
        Integer i = new Integer(32);
        System.out.println("I: " + i);
        intInsisde(i);
        System.out.println("I2: " + i);
    }

    void intInsisde(Integer i) {
        try {
            Field field = Integer.class.getDeclaredField("value");
            field.setAccessible(true);
            field.setInt(i, 707);

        } catch (Exception e) {
            //
        }
        System.out.println("I w srodku: " + i);
    }

Link do Ideone

Edit:
to jest oczywiście brudny trick. Będzie działał tylko dla pewnych jvm (wszystkie obecnie popularne), ale z tego co wiem JLS i JVM spec nie gwarantuje tego działania. Więc troszkę taki javowy UB.

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