можно вернуть значения из параметров в Java? - PullRequest
0 голосов
/ 12 ноября 2010

, как я знаю, Java всегда вызывает метод "передачей по значению". но я вижу ссылку на Android NotificationManager.notify (String, int, Notification):

Возвращает

 the id of the notification that is associated with the string

идентификатор, который можно использовать для отмены уведомление

пожалуйста, обратитесь к ссылке: http://developer.android.com/reference/android/app/NotificationManager.html

Как это могло произойти? Есть ли что-то, что я неправильно понимаю?

BR, Генри

Ответы [ 4 ]

3 голосов
/ 12 ноября 2010

Об этом заявлении:

"Java передает примитивы по значению, но передает объекты по ссылке. "

Это не точно . Java передает все по значению и вообще не передает объекты.

  • для примитивов: копии передаются в методы (не забывайте, что String не примитив) - это правильно, что вы сказали
  • для справочных переменных: они также передаются по значению: копия справочной переменной передается методу. Таким образом, сам объект никогда не передается. Объект можно изменить в методе (вызвав некоторые его методы), и вы увидите изменения после возврата из метода (например, вы измените элемент «name» из объекта Person), но если вы измените ссылку, это изменения не будут видны вне метода:

изменение ссылки производится оператором "new" или присваиванием, например, param = some_other_reference (где some_other_referece указывает на какой-то другой объект в куче) Изменение ссылки не повлияет на «исходную» ссылку, а только на «копию ссылки» (ссылка, используемая внутри метода).

0 голосов
/ 12 ноября 2010

Согласен с предыдущими постерами: документ, похоже, неверный.Метод требует три параметра, но в Javadoc упоминаются только два из них.Просто замените @return на @param, и вы получите описание для параметра id:

идентификатор уведомления, связанный со строковым идентификатором, который можно использовать для отмены уведомления

edit: вы можете определить этот идентификатор самостоятельно и использовать его позже для отмены уведомления.

0 голосов
/ 12 ноября 2010

Документация мне кажется неправильной. В декларации сказано:

public void notify (String tag, int id, Notification notification)

но в то же время говорит, что что-то возвращает.

Я интерпретирую это так: id однозначно сопоставляется с соответствующим уведомлением и может использоваться при отмене уведомления.

0 голосов
/ 12 ноября 2010

Похоже, Справочник по API для NotificationManager немного испорчен.

Вот код, найденный через Поиск кода Google в NotificationManager и Android :

/**
 * Persistent notification on the status bar,
 *
 * @param tag An string identifier for this notification unique within your
 *        application.
 * @param notification A {@link Notification} object describing how to
 *        notify the user, other than the view you're providing. Must not be null.
 * @return the id of the notification that is associated with the string identifier that
 * can be used to cancel the notification
 */
public void notify(String tag, int id, Notification notification)
{
    int[] idOut = new int[1];
    INotificationManager service = getService();
    String pkg = mContext.getPackageName();
    if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")");
    try {
        service.enqueueNotificationWithTag(pkg, tag, id, notification, idOut);
        if (id != idOut[0]) {
            Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]);
        }
    } catch (RemoteException e) {
    }
}

Очевидно, что параметр не возвращает значение. Они хотели иметь подобный JavaDoc, но, вероятно, допустили ошибку.

Посмотрите на код для другого варианта notify:

/**
 * Persistent notification on the status bar,
 *
 * @param id An identifier for this notification unique within your
 *        application.
 * @param notification A {@link Notification} object describing how to
 *        notify the user, other than the view you're providing. Must not be null.
 */
public void notify(int id, Notification notification)
{
    notify(null, id, notification);
}

Как видите, эта перегруженная версия просто вызывает основную реализацию со значением по умолчанию tag Строковое значение null.


Что касается общего вопроса о передаче по значению и передаче по ссылке, то простое / вульгарное объяснение таково:

  • Java передает примитивы по значению,
  • , но передает объекты по ссылке.

См. Комментарии Арнивана и Патрика для разъяснения.

...