aboutsummaryrefslogtreecommitdiff
path: root/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java')
-rw-r--r--java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java92
1 files changed, 39 insertions, 53 deletions
diff --git a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java
index 941b5def..acdc1de1 100644
--- a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java
+++ b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java
@@ -30,36 +30,32 @@
package com.google.protobuf;
+import static com.google.protobuf.Internal.checkNotNull;
+
/**
- * {@code SingleFieldBuilder} implements a structure that a protocol
- * message uses to hold a single field of another protocol message. It supports
- * the classical use case of setting an immutable {@link Message} as the value
- * of the field and is highly optimized around this.
- * <br>
- * It also supports the additional use case of setting a {@link Message.Builder}
- * as the field and deferring conversion of that {@code Builder}
- * to an immutable {@code Message}. In this way, it's possible to maintain
- * a tree of {@code Builder}'s that acts as a fully read/write data
- * structure.
+ * {@code SingleFieldBuilder} implements a structure that a protocol message uses to hold a single
+ * field of another protocol message. It supports the classical use case of setting an immutable
+ * {@link Message} as the value of the field and is highly optimized around this.
+ *
+ * <p>It also supports the additional use case of setting a {@link Message.Builder} as the field and
+ * deferring conversion of that {@code Builder} to an immutable {@code Message}. In this way, it's
+ * possible to maintain a tree of {@code Builder}'s that acts as a fully read/write data structure.
* <br>
- * Logically, one can think of a tree of builders as converting the entire tree
- * to messages when build is called on the root or when any method is called
- * that desires a Message instead of a Builder. In terms of the implementation,
- * the {@code SingleFieldBuilder} and {@code RepeatedFieldBuilder}
- * classes cache messages that were created so that messages only need to be
- * created when some change occurred in its builder or a builder for one of its
- * descendants.
+ * Logically, one can think of a tree of builders as converting the entire tree to messages when
+ * build is called on the root or when any method is called that desires a Message instead of a
+ * Builder. In terms of the implementation, the {@code SingleFieldBuilder} and {@code
+ * RepeatedFieldBuilder} classes cache messages that were created so that messages only need to be
+ * created when some change occurred in its builder or a builder for one of its descendants.
*
* @param <MType> the type of message for the field
* @param <BType> the type of builder for the field
* @param <IType> the common interface for the message and the builder
- *
* @author jonp@google.com (Jon Perlow)
*/
-public class SingleFieldBuilder
- <MType extends GeneratedMessage,
- BType extends GeneratedMessage.Builder,
- IType extends MessageOrBuilder>
+public class SingleFieldBuilder<
+ MType extends GeneratedMessage,
+ BType extends GeneratedMessage.Builder,
+ IType extends MessageOrBuilder>
implements GeneratedMessage.BuilderParent {
// Parent to send changes to.
@@ -80,14 +76,8 @@ public class SingleFieldBuilder
// to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.
private boolean isClean;
- public SingleFieldBuilder(
- MType message,
- GeneratedMessage.BuilderParent parent,
- boolean isClean) {
- if (message == null) {
- throw new NullPointerException();
- }
- this.message = message;
+ public SingleFieldBuilder(MType message, GeneratedMessage.BuilderParent parent, boolean isClean) {
+ this.message = checkNotNull(message);
this.parent = parent;
this.isClean = isClean;
}
@@ -98,10 +88,9 @@ public class SingleFieldBuilder
}
/**
- * Get the message for the field. If the message is currently stored
- * as a {@code Builder}, it is converted to a {@code Message} by
- * calling {@link Message.Builder#buildPartial} on it. If no message has
- * been set, returns the default instance of the message.
+ * Get the message for the field. If the message is currently stored as a {@code Builder}, it is
+ * converted to a {@code Message} by calling {@link Message.Builder#buildPartial} on it. If no
+ * message has been set, returns the default instance of the message.
*
* @return the message for the field
*/
@@ -127,8 +116,8 @@ public class SingleFieldBuilder
}
/**
- * Gets a builder for the field. If no builder has been created yet, a
- * builder is created on demand by calling {@link Message#toBuilder}.
+ * Gets a builder for the field. If no builder has been created yet, a builder is created on
+ * demand by calling {@link Message#toBuilder}.
*
* @return The builder for the field
*/
@@ -147,32 +136,28 @@ public class SingleFieldBuilder
}
/**
- * Gets the base class interface for the field. This may either be a builder
- * or a message. It will return whatever is more efficient.
+ * Gets the base class interface for the field. This may either be a builder or a message. It will
+ * return whatever is more efficient.
*
* @return the message or builder for the field as the base class interface
*/
@SuppressWarnings("unchecked")
public IType getMessageOrBuilder() {
if (builder != null) {
- return (IType) builder;
+ return (IType) builder;
} else {
return (IType) message;
}
}
/**
- * Sets a message for the field replacing any existing value.
+ * Sets a message for the field replacing any existing value.
*
* @param message the message to set
* @return the builder
*/
- public SingleFieldBuilder<MType, BType, IType> setMessage(
- MType message) {
- if (message == null) {
- throw new NullPointerException();
- }
- this.message = message;
+ public SingleFieldBuilder<MType, BType, IType> setMessage(MType message) {
+ this.message = checkNotNull(message);
if (builder != null) {
builder.dispose();
builder = null;
@@ -187,8 +172,7 @@ public class SingleFieldBuilder
* @param value the value to merge from
* @return the builder
*/
- public SingleFieldBuilder<MType, BType, IType> mergeFrom(
- MType value) {
+ public SingleFieldBuilder<MType, BType, IType> mergeFrom(MType value) {
if (builder == null && message == message.getDefaultInstanceForType()) {
message = value;
} else {
@@ -205,9 +189,11 @@ public class SingleFieldBuilder
*/
@SuppressWarnings("unchecked")
public SingleFieldBuilder<MType, BType, IType> clear() {
- message = (MType) (message != null ?
- message.getDefaultInstanceForType() :
- builder.getDefaultInstanceForType());
+ message =
+ (MType)
+ (message != null
+ ? message.getDefaultInstanceForType()
+ : builder.getDefaultInstanceForType());
if (builder != null) {
builder.dispose();
builder = null;
@@ -217,8 +203,8 @@ public class SingleFieldBuilder
}
/**
- * Called when a the builder or one of its nested children has changed
- * and any parent should be notified of its invalidation.
+ * Called when a the builder or one of its nested children has changed and any parent should be
+ * notified of its invalidation.
*/
private void onChanged() {
// If builder is null, this is the case where onChanged is being called