Java: 'статические' методы

Редактировать: or

Java 9 и более поздние версии предлагают очень элегантное решение:

Optional<String> myFunc() {
    return func1().or(this::func2);
}

or (введено в Java 9) делает именно то, что вы просили: Если Optional, возвращенное из func1, имеет значение, оно возвращается (или эквивалент Optional). Если нет, поставщик (здесь func2()) вызывается для получения Optional, который затем возвращается.

Java 8

Есть несколько способов. В Java 8 я предпочитаю брать значения из Optional из func1 и func2:

Optional<String> myFunc() {
    String returnValue = func1().orElse(func2().orElse(null));
    return Optional.ofNullable(returnValue);
}

Правка 2: Альтернативное предложение @ Хольгера в комментарии достаточно для цитирования в ответе (Хольгер, вы, возможно, разместили его в качестве комментария только потому, что вопрос закрыт, и поэтому вы не можете опубликовать свой собственный ответ):

    return func1().map(Optional::of).orElse(func2());

Это происходит в противоположном направлении : Отображение с использованием Optional::of оборачивает Optional из func1 внутри еще и Optional, только если оно имеет значение, из которого orElse снова разворачивает его.

Если вызов func2 дорогой, вы можете избежать его, когда он не нужен (когда func1 предоставляет значение):

    String returnValue = func1().orElseGet(() -> func2().orElse(null));

Или в версии Хольгера:

    return func1().map(Optional::of).orElseGet(this::func2);

isPresent, использованный в нескольких других ответах, настолько низкоуровневый, что я редко использую его и только как последнее средство.

5
задан Ande TURNER 18 November 2008 в 13:26
поделиться

4 ответа

Если Вы не настроили сборку "мусора" permgenspace, класс остается в памяти до выходов vm. Полный класс загружается всеми статическими методами.

11
ответ дан 18 December 2019 в 09:10
поделиться

Класс остается в памяти до classloader, который загрузился, тот класс остается в памяти. Так, если класс загружается из системного загрузчика класса, класс никогда не разгружается насколько я знаю.

Если Вы хотите разгрузить класс, Вы должны:

  1. Загрузите класс и все классы, которые относятся к тому классу с помощью пользовательского classloader
  2. После того, как Вы будете сделаны с тем классом, выпустите все ссылки на класс - т.е. удостоверитесь, что нет никаких экземпляров объектов того класса вокруг
  3. Разгрузите класс и все классы, относящиеся к нему путем выпуска пользовательского classloader экземпляра, который загрузил те классы.
4
ответ дан 18 December 2019 в 09:10
поделиться

В некоторых конфигурациях класс даже загружается перед совершением вызова. Мы использовали BES (Borland Enterprise Server), и у нас была проблема с нашими рабочими серверами Соляриса где все классы, на которые ссылаются, где загружено рекурсивно при запуске нашего приложения. Это означает, когда основной класс нашего приложения был загружен, сервер приложений загрузил весь класс, на который ссылаются в разделе импорта того класса... рекурсивно.

Как примечание стороны, если Вы не работаете в среде очень ограничения памяти, или если Вы загружаете партии и много ненужных классов, Вы не должны заботиться слишком много об использовании памяти классов, загруженных в памяти.

2
ответ дан 18 December 2019 в 09:10
поделиться

Класс Чего-то должен быть загружен, когда класс вызывающей стороны будет загружен. И это остается там до выхода VM, поскольку сказал krosenvold.

1
ответ дан 18 December 2019 в 09:10
поделиться
Другие вопросы по тегам:

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