Ленивый тип параметра в Java? - PullRequest
0 голосов
/ 24 июня 2011

У меня есть вопрос о передаче параметров в Java.Допустим, у меня есть метод:

public void x(Object o)

Допустим, я вызываю x (3) и x ("abc").x (3) займет немного больше времени, потому что создается новое целое число, так как 3 не является объектом.Предполагая, что я не могу изменить вызовы метода, только реализацию метода (и тип параметра), есть ли способ предотвратить эту конструкцию Integer до некоторой точки метода x, где я знаю, что это действительно необходимо?Тео

Ответы [ 4 ]

3 голосов
/ 24 июня 2011

Нет, у Java нет способа заставить лениво оценивать аргументы метода так, как вы его описываете.

Раздел 15.12.4 Спецификации языка Java точно объясняеткак работает вызов метода и как оцениваются аргументы метода перед его вызовом.

2 голосов
/ 24 июня 2011

Вы можете создать объект с отложенным вычислением, например, Callable

public void method(Callable<Object> callable) {
    // if you really need it
    Object obj = callable.call();
}

Причина, по которой вы не видите этого чаще, состоит в том, что он обычно медленнее и сложнее.

Кстати: x(3) не создаст объект, потому что на самом деле это x(Integer.valueOf(3)), а valueOf имеет кэш небольших значений Integer.

Для большинства приложений стоимость создания очень маленького простого объекта, такого как Integer, невеликапо сравнению со сложностью создания лениво оцененного значения.

Если вы хотите избежать создания объекта, вы можете иметь

public void x(Object o) ;
public void x(int i);

или

public void x(long l);

или

public void x(double d);

В следующем примере избегайте создания множества вариантов x.

0 голосов
/ 24 июня 2011

Если метод x имеет дело только с целыми числами, а не с какими-либо другими типами объектов, вы можете изменить метод на

public void x(int x){ //do something and then create the object as needed. }

Но в вашем случае метод собирается принятьлюбой тип объекта, поэтому нет другого пути, кроме создания нового целочисленного объекта.

0 голосов
/ 24 июня 2011

1) Нет способа отложить создание объекта

2) Разница будет настолько мала, что вам не нужно заботиться

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...