Java: Префикс / постфикс операторов увеличения / уменьшения?

У меня была такая же проблема, когда я узнал, что realmObjects должен наследовать непосредственно класс RealmObject (без поддержки наследования). Чтобы вернуться к преимуществам полиморфизма, я рассмотрел аналогичное решение для вас в сочетании с некоторыми трюками состава, которые позволили бы избежать дублирования атрибутов.

«Обсуждение дешево показывает мне код».

Примеры кода

interface IPerson {
    String getName();
}

class Person extends RealmObject implements IPerson {

    String name;

    @Override
    public String getName() {
        return name;
    }
}

interface IWorker extends IPerson {
    int getSalary();
}

class Worker extends RealmObject implements IWorker {

    Person person;
    int salary;

    @Override
    public String getName() {
        return person.getName();
    }

    @Override
    public int getSalary() {
        return salary;
    }
}

Некоторые преимущества

Вам не придется дублировать свои атрибуты в каждом расширяющемся классе.

Полиморфизм вернулся! Например, теперь вы можете имитировать листинг (с помощью getPerson () в этом примере).

Некоторые ограничения

При использовании библиотеки сериализации, использующей отражение (предположим, что это Gson), ваш сериализованные модели будут иметь встроенные атрибуты их родителей. Не что-то, что у вас было бы, если бы вы использовали классическое наследование.

Пример с JSON

Предположим, что Джон Доу делает 500 $ в месяц. (Он - рабочий и прав человека?).

С классическим наследованием Джон Доу будет выглядеть так:

{
  "name":"John Doe",
  "salary": 500
}

Но с этим обходным путем наследования ...:

{
  "person" : {
  "name":"John Doe"
  },
  "salary": 500
}

Надеюсь, что это поможет!

Примечание

К сожалению, PrimaryKeys необходимо дублировать.

Бонус

Вы может захотеть проверить RealmFieldNamesHelper , библиотеку, сделанную Christian Melchior ", чтобы сделать запросы в Царстве более безопасными типами.

29
задан gnerkus 6 February 2016 в 10:48
поделиться

10 ответов

i = 5;
System.out.println(++i); //6

Это печатает «6», потому что требуется, я добавляю один к нему и возвращает значение. 5 + 1 = 6; Это префикс, добавление к номеру перед использованием его в операции.

i = 6;
System.out.println(i++); //6 (i = 7, prints 6)

Это печатает «6», потому что оно берет i, сохраняет копию, добавляет 1 и возвращает копию. Таким образом, вы получаете значение, которым я был, но одновременно увеличиваете его. Поэтому вы распечатываете старое значение, но оно увеличивается. Возможность увеличения постфикса.

Затем, когда вы распечатываете i, оно показывает реальное значение i, потому что оно было увеличено. 7

63
ответ дан Paŭlo Ebermann 6 February 2016 в 10:48
поделиться

Думайте о ++i и i++ как о похожих на i = i+1., но это не то же самое. Разница в том, когда i получает новое приращение.

в ++i, приращение происходит немедленно.

, но если i++, то приращение произойдет, когда программа перейдет на следующую строку.

Посмотрите код здесь.

int i = 0;
while(i < 10){
   System.out.println(i);
   i = increment(i);
}

private int increment(i){
   return i++;
}

Это приведет к завершению цикла . потому что i будет возвращено с исходным значением, и после точки с запятой я буду увеличиваться, но возвращаемое значение не было. Поэтому i никогда не будет возвращено как увеличенное значение.

4
ответ дан Dilruk 6 February 2016 в 10:48
поделиться

Я знаю, что на это ответили, но подумал, что может помочь другое объяснение.

Другой способ проиллюстрировать это:

++i даст результат new i, i++ даст результат оригинала i и сохранит new i для следующее действие.

1124 Способ думать об этом - делать что-то еще внутри выражения. Когда вы печатаете текущее значение i, оно будет зависеть от того, было ли изменено i в выражении или после выражения.

    int i = 1;
result i = ++i * 2 // result = 4, i = 2

i оценивается (изменяется) до вычисления результата. Печать i для этого выражения показывает измененное значение i, использованное для этого выражения.

result i = i++ * 2 // result = 2, i = 2

i оценивается после вычисления результата. Таким образом, печать i из этого выражения дает исходное значение i, использованное в этом выражении, но i все еще изменяется для любого дальнейшего использования. Таким образом, печать значения для i сразу после выражения покажет новое увеличенное значение i. Поскольку значение i изменилось, будет ли оно напечатано или использовано.

result i = i++ * 2 // result = 2, i = 2
System.out.println(i); // 2

Если вы сохранили согласованный шаблон и включили строки печати для всех значений:

  int i = 3; 
System.out.println(i);    //  3
System.out.println(i++);  //  3
System.out.println(i);    // "4"
System.out.println(++i);  //  5          
System.out.println(i);    // "5"
System.out.println(++i);  // "6"
System.out.println(i++);  // "6"
System.out.println(i);    // "7"
14
ответ дан Yvette Colomb 6 February 2016 в 10:48
поделиться
System.out.println(i++);  // "6"

Это отправляет println значение, которое я имел до этой строки кода (6), а затем увеличивает I (до 7).

2
ответ дан Dhanuka 6 February 2016 в 10:48
поделиться

Он печатает 7 для последнего утверждения, потому что в приведенном выше утверждении его значение равно 6 и увеличивается до 7, когда печатается последнее утверждение

1
ответ дан Ujju 6 February 2016 в 10:48
поделиться

Хорошо подумайте об этом с точки зрения временных переменных.

i =3 ;
i ++ ; // is equivalent to:   temp = i++; and so , temp = 3 and then "i" will increment and become     i = 4;
System.out.println(i); // will print 4

Теперь

i=3;
System.out.println(i++);

эквивалентно

temp = i++;  // temp will assume value of current "i", after which "i" will increment and become i= 4
System.out.println(temp); //we're printing temp and not "i"
0
ответ дан Raj Shetty 6 February 2016 в 10:48
поделиться

Почему переменная не была обновлена?

  • Постфикс: передает текущее значение i в функцию, а затем увеличивает его.
  • Префикс: увеличивает текущее значение и передает его функции.

Линии, где ты ничего не делаешь, не имеют значения.

Обратите внимание, что это также верно для заданий:

i = 0;
test = ++i;  // 1
test2 = i++; // 1
2
ответ дан Steven Jeuris 6 February 2016 в 10:48
поделиться

Возможно, вы сможете лучше понять Префикс / постфикс с этим примером.

public class TestPrefixPostFix 
{
    public static void main (String[] args)
    { 
        int x=10;
        System.out.println( (x++ % 2 == 0)?"yes "+ x: " no "+x);
        x=10;
        System.out.println( (++x % 2 == 0)?"yes "+ x: " no "+x);
    }
}    
0
ответ дан Ilija Dimov 6 February 2016 в 10:48
поделиться

Это мой ответ. Некоторым из вас может быть легко это понять.

package package02;

public class C11PostfixAndPrefix {

    public static void main(String[] args) {
        // In this program, we will use the value of x for understanding prefix 
        // and the value of y for understaning postfix. 
        // Let's see how it works. 

        int x = 5; 
        int y = 5; 

        Line 13:   System.out.println(++x);  // 6   This is prefixing. 1 is added before x is used. 
        Line 14:   System.out.println(y++);  // 5   This is postfixing. y is used first and 1 is added. 

        System.out.println("---------- just for differentiating");

        System.out.println(x);  // 6   In prefixing, the value is same as before {See line 13}
        System.out.println(y);  // 6   In postfixing, the value increases by 1  {See line 14} 

        // Conclusion: In prefixing (++x), the value of x gets increased first and the used 
        // in an operation. While, in postfixing (y++), the value is used first and changed by
        // adding the number. 
    }
}
0
ответ дан Pang 6 February 2016 в 10:48
поделиться

Я знаю, что это - супер старый вопрос, но я не видел этот тип перечисленного ответа. Рассмотрение примера того, как фактические операторы реализованы, полезно для меня, возможно, это было бы полезно для кого-то еще

class Integer {
  private int __i;

  function Integer ++() { // prefix operator i.e. ++x
    __i+=1; //increment
    return this; //return object with incremented value
  }

  function Integer ++(Integer x) { //postfix operator i.e. x++
    __i+=1; //increment
    return x; //return original object
  }
}
0
ответ дан 28 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: