Zwiększyć wartość integera?

81

Jak zwiększyć wartość liczby całkowitej w języku Java? Wiem, że mogę uzyskać wartość za pomocą intValue i mogę ustawić ją za pomocą nowej wartości Integer (int i).

playerID.intValue()++;

nie wydaje się działać.

Uwaga: PlayerID to liczba całkowita utworzona za pomocą:

Integer playerID = new Integer(1);
William
źródło
7
Dlaczego używasz liczb całkowitych zamiast liczb całkowitych?
amara
5
@naiad Dla mnie jest to zwykle spowodowane tym, że nie można używać typów pierwotnych jako argumentów ogólnych w Javie.
Steve Blackwell

Odpowiedzi:

100

Integerobiekty są niezmienne, więc nie można modyfikować ich wartości po ich utworzeniu. Będziesz musiał utworzyć nowy Integeri zastąpić istniejący.

playerID = new Integer(playerID.intValue() + 1);
Grodriguez
źródło
4
Jeśli musisz użyć nieprymitywnego int i chcesz zmienności, możesz wypróbować commons MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/…
Joel
dzięki, ale z jakiegoś powodu nadal się nie zwiększa. Może to błąd w moim kodzie ...
William
1
@William: Jak wiem, będzie on zwiększany tylko w metodzie, która go zwiększa.
Stan Kurilin
13
Nie używaj konstruktora typu Integer.
ColinD,
2
@Grodriguez: Być może, chociaż nawet wtedy sugerowałbym Integer.valueOf(int)... Nie podoba mi się pomysł używania złych praktyk w odpowiedziach, może to prowadzić do tego, że ludzie myślą, że są w porządku. Myślę też, że to przydatne dla PO sobie sprawę, że może on wykorzystać operacje że on użytku z intze związkiem Integerw ten sam sposób.
ColinD,
49

Jak mówi Grodriguez, Integerprzedmioty są niezmienne. Problem polega na tym, że próbujesz zwiększyć intwartość identyfikatora gracza, a nie samego identyfikatora. W Javie 5+ możesz po prostu pisać playerID++.

Na marginesie, nigdy przenigdy nie dzwoń Integerdo konstruktora. Skorzystaj z autoboxingu, przypisując ints doInteger s bezpośrednio s, na przykład Integer foo = 5. Będzie to używać w sposób Integer.valueOf(int)przezroczysty, co jest lepsze od konstruktora, ponieważ nie zawsze musi tworzyć nowy obiekt.

ColinD
źródło
14

AtomicInteger

Może to też jest warte: istnieje klasa Java o nazwie AtomicInteger .

Ta klasa ma kilka przydatnych metod, takich jak addAndGet(int delta)or incrementAndGet()(i ich odpowiedniki), które umożliwiają zwiększanie / zmniejszanie wartości tej samej instancji. Chociaż klasa została zaprojektowana do użytku w kontekście współbieżności , jest również przydatna w innych scenariuszach i prawdopodobnie pasuje do Twoich potrzeb.

final AtomicInteger count = new AtomicInteger( 0 ) ;
…
count.incrementAndGet();  // Ignoring the return value. 
Vivit
źródło
13

Java 7 i 8. Przyrost powoduje zmianę odwołania, więc odwołuje się do innego obiektu typu Integer. Popatrz:

@Test
public void incInteger()
{
    Integer i = 5;
    Integer iOrig = i;
    ++i; // Same as i = i + 1;
    Assert.assertEquals(6, i.intValue());
    Assert.assertNotEquals(iOrig, i);
}

Sama liczba całkowita jest nadal niezmienna.

vitvlkv
źródło
To jest najlepsza odpowiedź IMHO, ponieważ demonstruje ++ifunkcję (na zmiennej i; zauważ, że mogłeś również napisać i++) i Integerniezmienność klasy (na zmiennej iOrig). Większość innych odpowiedzi przedstawia tylko jedno z dwóch pojęć.
Julien Kronegg
7

Obiekty całkowite są niezmienne. Nie możesz zmienić wartości liczby całkowitej przechowywanej przez sam obiekt, ale możesz po prostu utworzyć nowy obiekt Integer, aby przechowywać wynik:

Integer start = new Integer(5);
Integer end = start + 5; // end == 10;
RHSeeger
źródło
6

W Javie 7 operator przyrostu „++” działa na liczbach całkowitych. Poniżej znajduje się sprawdzony przykład

    Integer i = new Integer( 12 );
    System.out.println(i); //12
    i = i++;
    System.out.println(i); //13
samsamara
źródło
2
Ale pamiętaj, że inne odniesienia do i = new Integer(12)nadal będą odnosić się do 12, a nie 13... łatwo się o to
potknąć
1
tak, dlatego musisz ponownie przypisać wartość do obiektu będącego liczbą całkowitą: i = i ++
samsamara
2
i = i++to nie to samo co i++. Technicznie rzecz biorąc, ++tak naprawdę nie działa na liczbach całkowitych, powiedziałbym, że nie możesz go używać samodzielnie bez przypisania czemuś wyniku.
Simon Forsberg
1
nie musisz ponownie przypisywać! look: Integer foo = 5; Integer bar = foo; foo ++; System.out.println ("foo:" + foo + "bar:" + bar); wyjścia: foo: 6 bar: 5
clemep
4

Może możesz spróbować:

final AtomicInteger i = new AtomicInteger(0);
i.set(1);
i.get();
fantouch
źródło
3

Możesz użyć IntHolder jako zmiennej alternatywy dla Integer. Ale czy warto?

Stan Kurilin
źródło
1

Wszystkie prymitywne obiekty opakowania są niezmienne.

Być może spóźniłem się z pytaniem, ale chcę dodać i wyjaśnić, że kiedy to zrobisz playerID++, tak naprawdę dzieje się tak:

playerID = Integer.valueOf( playerID.intValue() + 1);

Integer.valueOf (int) zawsze buforuje wartości z zakresu od -128 do 127 włącznie i może buforować inne wartości spoza tego zakresu.

Hamza Belmellouki
źródło
1
playerID = Integer.valueOf (playerID.intValue () + 1); Nowy obiekt Integer nie zawsze jest tworzony. Specyfikacja autoboxingu: docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 Jeśli wartość p w ramce to prawda, fałsz, bajt lub znak w zakres \ u0000 do \ u007f lub liczba int lub krótka między -128 a 127 (włącznie), a następnie niech r1 i r2 będą wynikami dowolnych dwóch konwersji bokserskich p. Zawsze jest tak, że r1 == r2. Od wersji Java 7 docs.oracle.com/javase/specs/jls/se7/html/… dotyczy również operatora ++
gary
Rozumiem, zredagowano odpowiedź. Zwiększanie obiektu Integer playerID++daje w wyniku coś podobnego playerID = Integer.valueOf( playerID.intValue() + 1)i zgodnie z dokumentacją metody: Ta metoda zawsze buforuje wartości z zakresu od -128 do 127 włącznie.
Hamza Belmellouki