Возврат Java - PullRequest
       13

Возврат Java

5 голосов
/ 25 февраля 2011
  1. Каков эффект не перехвата значения метода, который возвращает значение?

  2. Возникает ли сложность, такая как проблемы с памятью, если возвращаемое значение былоне пойман.

Пример фрагментов кода:

//reference types
public Object[] thismethodreturnsvalue(){
   return new Object[]{new Object(),new Object(),new Object()};
}

//primitive types
public int thismethodreturnsint(){
   return -1;
}

public static void main(String a[]){
   thismethodreturnsvalue();
   thismethodreturnsint();
}

Ответы [ 6 ]

3 голосов
/ 25 февраля 2011

1.Каков эффект не перехвата значения метода, который возвращает значение?

Никакого эффекта на самом деле.

Возвращаемое значение будет вычислено, и если оно былосозданный в куче (как в первом примере), он сразу же будет иметь право на сборку мусора.

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

2.Вызывает ли это осложнения, такие как проблемы с памятью, если возвращаемое значение не было поймано.

Нет, не совсем.Как я сказал выше, это будет сборщик мусора.

Вот дамп байт-кода того, что происходит на сайте вызова:

public class Test {

    public static int testMethod() {
        return 5;
    }

    public static void main(String[] args) {
        testMethod();
    }
}

... соответствующий байт-код:

public static int testMethod();
  Code:
   0:   iconst_5
   1:   ireturn


public static void main(java.lang.String[]);
  Code:
   0:   invokestatic    #2;
   3:   pop                 // return value popped immediately.
   4:   return
}
2 голосов
/ 25 февраля 2011
  1. Нет эффекта. Если вы просто выполните метод для побочных эффектов, а не возвращаемое значение, все, что произойдет, это побочные эффекты будут сделаны.

  2. Неа. Возвращаемое значение сразу помечается для сборки мусора.

1 голос
/ 25 февраля 2011

Ничего плохого не происходит только потому, что возвращаемое значение отбрасывается.Но в некоторых случаях это может указывать на неправильное использование или неправильное понимание API (например, String.replace ()).

0 голосов
/ 25 февраля 2011

Довольно странно, если метод возвращает значение, а вызывающая сторона игнорирует его.

Вообще говоря, у методов есть две утилиты, одна для запроса состояния системы, другая для изменения состояния системы.

Некоторые утверждают, что метод должен делать только одну из двух вещей, но не обе. Метод запроса не должен изменять состояние системы и должен возвращать значение. Метод обновления не должен возвращать значение. Чтобы узнать новое состояние системы после вызова метода обновления, вызовите метод запроса.

В этой парадигме, безусловно, неправильно игнорировать возвращаемое значение - если не для получения возвращаемого значения, вызов метода (запроса) является полностью поддельным.

Эта парадигма не та, которую мы принимаем. У нас есть методы, смешивающие две утилиты вместе. Существуют также методы, которые возвращают значения по некоторым другим странным причинам, например, такие «беглые методы». Поэтому иногда оправданно игнорировать возвращаемые значения метода.

0 голосов
/ 25 февраля 2011

Возвращаемое значение будет выделено при вызове, но так как оно не будет иметь ссылок на него, оно будет иметь право на сборку мусора

0 голосов
/ 25 февраля 2011

Нет никаких последствий для этого в JVM. Может быть неясно, если вы не используете возвращаемое значение, так как вы просто вызываете метод для его побочных эффектов.

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

...