2014-07-11 3 views
0

Я заметил удивленный поведение:Почему я не могу увеличить возвращаемое значение?

Я могу написать так:

Integer integer = 0; 
integer++; 

Но я не могу написать так:

getInteger()++; 

если

public static Integer getInteger(){ 
     return 0; 
    } 

Для меня два фрагмента выглядят одинаково.

Но второй сниппеты производит:

unexpected type 
     getInteger()++; 
       ^
    required: variable 
    found: value 

Почему второй конструкции является запретить?

Часто в коде я вынужден писать уродливые конструкции, как это:

obj.set(obj.get()+1); 

Это выглядит избыточно.

+0

вы не можете выполнять константу ++, то есть 5 ++. В вашем методе вы возвращаетесь 0; – Rahul

+0

Насколько отличается obj.get() + 1 от obj.get() ++? –

+0

Что вы ожидаете от этого? Перевести на вызов 'setInteger (getInteger() + 1)'? Не забывайте, что язык Java * не знает ничего о геттерах и сеттерах ... –

ответ

7

x++ - это не то же самое, что x + 1. Это сокращение от x += 1, то есть x = x + 1; приращение, затем назначьте. Таким образом, getInteger()++ означает getInteger() = getInteger() + 1, что не имеет смысла. Вы добавляете его к значению, не увеличивая переменную.

Кроме того, ++ работы по int но не Integer, но даже если вы возвращаете int вы не можете увеличить его с ++:

class Test { 
    static public void main() { 
     getint()++; 
    } 
    static int getint() { 
     int a = 0; 
     return a; 
    } 
} 

дает

Test.java:3: error: unexpected type 
     getint()++; 
      ^
    required: variable 
    found: value 

(В C++, вы можете сделать эту работу со ссылками, но у Java нет таких.)

+1

@Alnitak Integer не поддерживает, но Java 5.0+ поддерживает его с боксом. –

+1

@PeterLawrey справедливая точка зрения о боксе - предположительно, компилятор не может вставить в сценарий 'getInteger() ++' – Alnitak

+0

@Alnitak Он не работает с 'int', см. Пример. –

0

Вы не возвращаете int, вы возвращаете объект Integer. Класс Integer является неизменным и не имеет собственного оператора ++.

Кроме того, оператор ++ требует, чтобы его операнд был lvalue, то есть назначаемой переменной, а не value. Результатом является getInteger().

В случае первого теста:

Integer integer = 0; integer++; 

Autoboxing Java позволяет использовать оператор ++, но только потому, что Java автоматически преобразует Integer в int, а затем обратно, и из-за переменной integer это lvalue.Это более или менее эквивалентно:

int tmp_int = integer.intValue(); 
int result = tmp_int++; 
integer = Integer.getInteger(tmp_int); 
(void)result;      

result - эффективное «значение» выражения не integer, потому что вы использовали версию «после прибавка» в ++, поэтому результатом является значение, которое integer имел до он был увеличен.

+0

** Integer integer = 0; integer ++; ** этот код работает – gstackoverflow

+0

@gstackoverflow да, см. Обновление – Alnitak

0

Почему запрещается строительство вторых сооружений?

Integer непреложный, поэтому вы все равно не могли его изменить. int изменен, но поскольку он возвращает только копию, это тоже не сработает.

например.

public static Integer getInteger(){ 
    return 0; 
} 

// what would this do 
getInteger()++; 

// now the method has been changed to 
public static Integer getInteger(){ 
    return 0+1; 
} 
// so now 
System.out.println(getInteger()); // prints 1 ?? 

obj.set (obj.get() + 1);

Это также разрушает инкапсуляцию. Я хотел бы предложить способ, как этот

AtomicInteger i = new AtomicInteger(0); 
i.incrementAndGet(); 

или вы могли бы иметь свой собственный

i.incr(); 
2

8 ++ не имеет смысла, в то время как

int x=8; 
x++; 

имеют смысл , потому что х ++, работает как x+=1, то есть x=x+1 и 8=8+1 что-то не приемлемо.

1

Как говорится, для этого требуется переменная для оператора ++. ++ увеличивает значение, которое где-то хранится, поэтому в этом месте теперь добавляется увеличенное значение. ваша функция просто возвращает значение , которое не является переменной .

Это так же просто, как упоминается в комментарии Рахул.

//This works 
x=5; 
x++; //Now x=6 since x++ is equivalent to x=x+1; 

//This doesn't work 
5++; //this doesn't even make sense, trying to do 5=5+1?? 

//similarly, getNumber() is just a value that is returned, it is a value, not a variable 
//So it is like the second case 
//This doesn't work 
getNumber()++; //Trying to do getNumber()=getNumber()+1; ?? 
Смежные вопросы