Hi Stuart,
I also prefer your wording. There's just a nit...
On 10/5/19 1:46 AM, Stuart Marks wrote:
On 10/3/19 8:32 AM, Joe Darcy wrote:
In response to the recent and on-going review of serializable types
in the base module and elsewhere, I thought it would be helpful if
the collections specs discussed how collections were serialiazable.
In particular, the proposed terminology is that a collection is
"conditionally serializable" if the collection type implements
java.io.Serializable and all the elements of the collections are
serializable.
Candidate wording changes to java.util.Collection below. If this
notion is deemed useful, I can also go through and add "This
collection is conditionally serializable."notes to ArrayList,
HashMap, and other such collections.
Hi Joe,
Thanks for doing this. In general I agree that there should be some
discussion about the serializability of collections. I think it's
reasonable to put that here (in the Collection interface) which seems
to represent the top-level documentation for the entire Collections
framework, not just that interface. I don't think it's necessary to
mention conditional serializability in every location. However, I
think a broader discussion of serializability in the collections
framework is warranted. Here's some alternative wording:
diff -r 4a98c87dfd89 -r 6aea42e7cb15
src/java.base/share/classes/java/util/Collection.java
--- a/src/java.base/share/classes/java/util/Collection.java Thu Oct
03 23:13:28 2019 -0700
+++ b/src/java.base/share/classes/java/util/Collection.java Fri Oct
04 16:45:19 2019 -0700
@@ -188,6 +188,38 @@
* or if the only reference to the backing collection is through an
* unmodifiable view, the view can be considered effectively immutable.
*
+ * <h2><a id="serializable">Serializability of Collections</a></h2>
+ *
+ * <p>Serializability of collections is optional. As such, none of
the collections
+ * interfaces are declared to implement the {@link
java.io.Serializable} interface.
+ * However, serializability is regarded as being generally useful, so
most collection
+ * implementations are serializable.
+
+ * <p>The collection implementations that are public classes (such as
{@code ArrayList}
+ * or {@code HashMap}) are declared to implement the {@code
Serializable} interface if they
+ * are in fact serializable. Some collections implementations are not
public classes,
+ * such as the <a href="unmodifiable">unmodifiable collections.</a>
In such cases, the
+ * serializability of such collections is described in the
specification of the method
+ * that creates them, or in some other suitable place. In cases where
the serializability
+ * of a collection is not specified, there is no guarantee about the
serializability of such
+ * collections. In particular, many <a href="view">view
collections</a> are not serializable.
+ *
+ * <p>A collection implementation that implements the {@code
Serializable} interface cannot
+ * be guaranteed to be serializable. The reason is that in general,
collections
+ * contain elements of other types, and it is not possible to
determine statically
+ * whether instances the element type are actually serializable. For
example, consider
... whether instances *of* the element type(s) are actually ...
(there are two element types in the Map<K, V>)
+ * a serializable {@code Collection<E>}, where {@code E} does not
implement the
+ * {@code Serializable} interface. The collection may be
serializable, if it contains only
+ * elements of some serializable subtype of {@code E}, or if it is
empty. Collections are
+ * thus said to be <i>conditionally serializable,</i> as the
serializability of the collection
+ * as a whole depends on whether the collection itself is
serializable and on whether all
+ * contained elements are also serializable.
+ *
+ * <p>An additional case occurs with instances of {@link SortedSet}
and {@link SortedMap}.
+ * These collections can be created with a {@link Comparator} that
imposes an ordering on
+ * the set elements or map keys. Such a collection is serializable
only if the provided
+ * {@code Comparator} is also serializable.
+ *
* <p>This interface is a member of the
* <a
href="{@docRoot}/java.base/java/util/package-summary.html#CollectionsFramework">
* Java Collections Framework</a>.
s'marks
Regards, Peter