Предаването на аргументи към метод винаги ли е подредено отляво надясно в java?

Ще извикам метод с два аргумента, но ще използвам k++ така:

polygon.addPoint((int)rs.getDouble( k++),(int)rs.getDouble( k++ ));

Всъщност искам да съм сигурен, че jvm първо изпълнява първия аргумент, а след това втория. Ако по някакъв начин редът се промени, аргументите ще бъдат предадени в грешен ред.

Благодаря много!


person Ismail Yavuz    schedule 27.03.2014    source източник
comment
Създаването на две различни цели числа би направило този код по-лесен за поддържане IMHO.   -  person sp00m    schedule 27.03.2014
comment
Въпреки че подреждането трябва да е гарантирано, не бих разчитал на това, особено ако има прости начини да се отървете от тази зависимост.   -  person Thomas    schedule 27.03.2014


Отговори (3)


Да, гарантирано е, че аргументите се оценяват отляво надясно. Всеки компилатор, който отговаря на правилата на JLS, трябва да го следва. Това е споменато в JLS 15.7. 4:

В извикване на метод или конструктор или израз за създаване на екземпляр на клас, аргументните изрази могат да се появят в скобите, разделени със запетаи. Всеки израз на аргумент изглежда напълно оценен преди която и да е част от който и да е израз на аргумент отдясно.

person Rohit Jain    schedule 27.03.2014
comment
Благодаря за отговора и справката :) - person Ismail Yavuz; 31.03.2014

Да, Java гарантира това. Това обаче не означава, че използването на кода по този начин е добра идея: читателите на вашия код може да се объркат напълно.

Много по-чисто е да се покаже изрично реда:

int a = (int)rs.getDouble(k++);
int b = (int)rs.getDouble(k++);
polygon.addPoint(a, b);
person Sergey Kalinichenko    schedule 27.03.2014

Java не поддържа именувани параметри, така че правилно разбирате, че параметрите се четат в позиция.

Например, метод със сигнатура (int, String) и метод със сигнатура (String, int) никога няма да бъдат объркани един с друг, Java взема под внимание вида и последователността от параметри, когато определя какъв метод да извика.

По същия начин във вашия метод винаги ще имате параметри, идващи по предвидим и еднакъв начин.

Поради тази причина първият k++ винаги ще се изпълнява първи, а вторият k++ винаги след това и това е гарантирано поведение.

person Ewald    schedule 27.03.2014
comment
OP попита основно дали левият k++ ще бъде изпълнен преди десния k++ и дали това е гарантирано. Не съм сигурен къде адресирате това. - person peter.petrov; 27.03.2014
comment
Питър, прав си, коригирах отговора си, благодаря ти за приноса. - person Ewald; 27.03.2014