Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 94de7ab

Browse files
Introduce getMessageExtensionOrNull for extendable messages to avoid the code pattern of hasExtension() ? getExtension : null which takes an extra extension lookup.
PiperOrigin-RevId: 926787242
1 parent c99b4fb commit 94de7ab

1 file changed

Lines changed: 35 additions & 0 deletions

File tree

java/core/src/main/java/com/google/protobuf/GeneratedMessage.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,10 @@ default <T> int getExtensionCount(GeneratedExtension<MessageT, List<T>> extensio
961961
/** Get the value of an extension. */
962962
<T> T getExtension(ExtensionLite<? extends MessageT, T> extension);
963963

964+
/** Get the value of a message-typed extension, or null if it is not set. */
965+
<T extends MessageLite> T getMessageTypedExtensionOrNull(
966+
ExtensionLite<? extends MessageT, T> extension);
967+
964968
/** Overload to maintain ABI compatibility. See {@link #getExtension(ExtensionLite)}. */
965969
default <T> T getExtension(Extension<? extends MessageT, T> extension) {
966970
return getExtension((ExtensionLite<? extends MessageT, T>) extension);
@@ -1098,6 +1102,21 @@ public final <T> T getExtension(final ExtensionLite<? extends MessageT, T> exten
10981102
return (T) extension.fromReflectionType(value);
10991103
}
11001104

1105+
@Override
1106+
@SuppressWarnings("unchecked") // Safe as fromReflectionType will always match the type of T.
1107+
public final <T extends MessageLite> T getMessageTypedExtensionOrNull(
1108+
final ExtensionLite<? extends MessageT, T> extensionLite) {
1109+
Extension<MessageT, T> extension = checkNotLite(extensionLite);
1110+
1111+
final FieldDescriptor descriptor = extension.getDescriptor();
1112+
verifyExtensionContainingType(descriptor);
1113+
final Object value = extensions.getField(descriptor);
1114+
if (value == null) {
1115+
return null;
1116+
}
1117+
return (T) extension.fromReflectionType(value);
1118+
}
1119+
11011120
/** Get one element of a repeated extension. */
11021121
@Override
11031122
@SuppressWarnings("unchecked")
@@ -1484,6 +1503,22 @@ public final <T> T getExtension(final ExtensionLite<? extends MessageT, T> exten
14841503
return (T) extension.fromReflectionType(value);
14851504
}
14861505

1506+
@Override
1507+
@SuppressWarnings("unchecked") // Safe as fromReflectionType will always match the type of T.
1508+
public final <T extends MessageLite> T getMessageTypedExtensionOrNull(
1509+
final ExtensionLite<? extends MessageT, T> extensionLite) {
1510+
Extension<MessageT, T> extension = checkNotLite(extensionLite);
1511+
verifyExtensionContainingType(extension);
1512+
if (extensions == null) {
1513+
return null;
1514+
}
1515+
final Object value = extensions.getField(extension.getDescriptor());
1516+
if (value == null) {
1517+
return null;
1518+
}
1519+
return (T) extension.fromReflectionType(value);
1520+
}
1521+
14871522
/** Get one element of a repeated extension. */
14881523
@Override
14891524
public final <T> T getExtension(

0 commit comments

Comments
 (0)