Vinnaren i pepparkakshustävlingen!
2017-11-10, 01:40
  #1
Medlem
Hur får jag en array att bli icke-muterbar i Java? Googlade lite och hittade att man kan använda Collections.unmodifiableList för detta. Verkar fungera halvbra...

Kod:
int[][] integers = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };
List<int[]> immutableIntegers = Collections.unmodifiableList(Arrays.asList(integers));

System.out.println(immutableIntegers.get(0)[0]); // skriver ut 1

integers[0][0] = 2;

System.out.println(immutableIntegers.get(0)[0]); // skriver ut 2

Hur gör jag för att den sista raden ska skriva ut 1?
Citera
2017-11-10, 03:58
  #2
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av sticky4loop
Hur får jag en array att bli icke-muterbar i Java? Googlade lite och hittade att man kan använda Collections.unmodifiableList för detta. Verkar fungera halvbra...

Kod:
int[][] integers = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };
List<int[]> immutableIntegers = Collections.unmodifiableList(Arrays.asList(integers));

System.out.println(immutableIntegers.get(0)[0]); // skriver ut 1

integers[0][0] = 2;

System.out.println(immutableIntegers.get(0)[0]); // skriver ut 2

Hur gör jag för att den sista raden ska skriva ut 1?
Inget jag känner till, och nu ska jag sova, men formuleringen "unmodifiable view" antyder ju att det inte handlar om riktig omuterbarhet.
https://docs.oracle.com/javase/7/doc...llections.html
En tanke: gör listan privat och låt bara den "unmodifiable view" vara publik? Gissar rejält just nu, god natt.
Citera
2017-11-10, 11:07
  #3
Medlem
Citat:
Ursprungligen postat av Neksnor
Inget jag känner till, och nu ska jag sova, men formuleringen "unmodifiable view" antyder ju att det inte handlar om riktig omuterbarhet.
https://docs.oracle.com/javase/7/doc...llections.html
En tanke: gör listan privat och låt bara den "unmodifiable view" vara publik? Gissar rejält just nu, god natt.

Tyvärr fungerar inte det heller. Det blir en slags pekkedja som alltid refererar till den första variabeln.
Citera
2017-11-10, 18:28
  #4
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av sticky4loop
Hur får jag en array att bli icke-muterbar i Java? Googlade lite och hittade att man kan använda Collections.unmodifiableList för detta. Verkar fungera halvbra...

Kod:
int[][] integers = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };
List<int[]> immutableIntegers = Collections.unmodifiableList(Arrays.asList(integers));

System.out.println(immutableIntegers.get(0)[0]); // skriver ut 1

integers[0][0] = 2;

System.out.println(immutableIntegers.get(0)[0]); // skriver ut 2

Hur gör jag för att den sista raden ska skriva ut 1?
Du missuppfattar vad som är immutable. Din ursprungliga referens (den du kallar integers) är och förblir naturligtvis mutable, oavsett vilka typer av alternativa referenser du skapar till den, immutable eller inte.
Citera
2017-11-11, 14:14
  #5
Medlem
Citat:
Ursprungligen postat av sticky4loop
Tyvärr fungerar inte det heller. Det blir en slags pekkedja som alltid refererar till den första variabeln.
Du får göra så här så du inte kan pilla på arrayen:
Kod:
List<int[]> immutableIntegerList = Collections.unmodifiableList(Arrays.asList(new int[][] {{1,2,3},{4,5,6}}));
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback