У меня есть старый устаревший код:
зависимость com.google.guava:guava:15.0
@Entity
@Table(name = "profiles")
public class Profile {
@Id
@Column(name = "id", nullable = false)
private UUID id;
@JoinColumn(
name = "recipient_profile")
private Profile recipientProfile;
....
}
@Entity
@Table(name = "standalone_credit")
public class StandaloneCredit {
@Id
@Column(name = "id", nullable = false)
private UUID id;
@JoinColumn(name = "recipient_profile_internal_id")
private Profile recipientBusinessProfile;
....
}
import com.google.common.base.MoreObjects;
StandaloneCredit credit;
Profile recipientProfile =
MoreObjects.firstNonNull(credit.getRecipientProfile(), credit.getRecipientBusinessProfile());
com.google.guava:guava:15.0
— это зависимость от implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix:2.2.10.RELEASE'
Как я могу заменить MoreObjects
, не нарушая логику кода с помощью базовой реализации кода Java?
Извини. Обновлен код.
Я не думаю, что вы ответили на вопрос @tgdavies.
Я имею в виду, как я могу заменить код из com.google.common.base.MoreObjects
основным кодом Java, сохранив при этом ту же функциональность кода?
MoreObjects.firstNonNull
можно напрямую заменить на Objects.requireNonNullElse:
Profile recipientProfile = Objects.requireNonNullElse(
credit.getRecipientProfile(), credit.getRecipientBusinessProfile());
В последних версиях Guava Javadocs есть конкретные инструкции по выполнению этой замены, а именно:
Пользователи Java 9: вместо этого используйте
java.util.Objects.requireNonNullElse(first, second)
.
Чтобы добавить немного больше контекста, метод Guava MoreObjects.firstNonNull
появился раньше Java 9, когда Objects.requireNonNullElse
был добавлен в Java. Ожидается, что пользователи, использующие Guava в более новых версиях Java, должны будут перейти на встроенный метод Java.
Анализ документации Java этих двух методов показывает, что ожидается, что они будут вести себя идентично друг другу.
public static <T> T firstNonNull(@CheckForNull T first, @CheckForNull T second)
Возвращает первый из двух заданных параметров, который не является
null
, если он есть, или в противном случае выдаетNullPointerException
.[…]
Броски:
NullPointerException
- если обаfirst
иsecond
являютсяnull
public static <T> T requireNonNullElse(T obj, T defaultObj)
Возвращает первый аргумент, если он не
null
, и в противном случае второй аргумент, если он неnull
.[…]
Броски:
NullPointerException
— если обаobj
равны нулю, аdefaultObj
—null
В этом конкретном случае зависимость можно устранить, добавив этот чистый метод Java в ваш класс.
public static Profile firstNonNull(Profile p1, Profile p2) {
if (p1 != null)
return p1;
else if (p2 != null)
return p2;
else
throw new NullPointerException("Both profiles are null.");
}
Затем вызывающий код можно обновить следующим образом:
Profile recipientProfile = firstNonNull(credit.getRecipientProfile(), credit.getRecipientBusinessProfile());
Можно также написать общее решение с использованием дженериков, но это выходит за рамки вопроса.
Решение для дженериков — это очень простое изменение строки сигнатуры метода: public static <T> T firstNonNull(T p1, T p2) {
Что именно вы спрашиваете? Вы спрашиваете, что делает
MoreObjects.firstNonNull
? Вы знаете и спрашиваете, как это сделать на простой Java?