MumbleCloseable
Remi Forax
forax at univ-mlv.fr
Thu Jul 11 10:50:26 PDT 2013
On 07/11/2013 07:29 PM, Brian Goetz wrote:
> A small wrinkle has emerged here; if you look at the Javadoc for Stream:
>
>
> http://cr.openjdk.java.net/~briangoetz/doctmp/doc/java/util/stream/Stream.html
>
>
> the nested annotation HoldsResource bleeds through into the Javadoc
> for any subtype of MHCR. This is really leaky; this should not be
> considered a nested member, and its presence in the docs will be
> confusing to users of Stream, who will wonder "WTF is this?"
>
> Options:
> - Kill the annotation for now, and revisit at a later time. This
> deprives APIs of the ability to say "Hey, I really do return a
> resource-ful stream" and deprives static analysis tools of the ability
> to perform sharper inspections. Since a Javadoc reboot is on the
> board for Java 9, we may be able to get finer control over doc
> generation like this in the future, making this a more useful tool for
> API designers, but right now, its pretty ugly.
>
> - Move the annotation to top level. Would need a longer name, but
> that's probably OK as @HoldsCloseableResource is still shorter than
> @MayHoldCloseableResource.HoldsResource. Crappy namespace management,
> but that's life in java.util.
>
> - Leave as is.
>
> In order, my preferences are #2, #1, and #3.
>
> Other opinions?
Remove the annotation and MayHoldCloseableResource and document in
Stream that Stream doesn't follow the strict semantics of AutoCloseable.
It will be enough for static analysis tools for 8 and post pone the
inclusion of MayHoldCloseableResource in 9.
Rémi
>
> On 6/30/2013 9:32 AM, Doug Lea wrote:
>> On 06/28/13 17:59, Brian Goetz wrote:
>>
>>> Here's the current draft spec for interface and annotation.
>>
>> Pasted below is version after an edit pass between Brian and me.
>>
>>> Bikeshed opportunity: should the annotation be nested or at top level?
>>
>> I think nested, but if so, it seems cruel to give it such a long name:
>>
>> @MayHoldCloseableResource.DefinitelyHoldsCloseableResource
>>
>> So the remaining bikeshed opportunity is what's shorter
>> but still crystal-clear? We probably can't get away with
>> just:
>>
>> @MayHoldCloseableResource.Yes
>>
>> Any ideas?
>>
>> ...
>>
>> /**
>> * An object that may (but need not) hold one or more references to
>> * resources that will be released when closed. Such objects may be
>> * used with try-with-resources or related {@code try...finally}
>> * constructions that ensure they are closed as soon as they are no
>> * longer needed. Interface MayHoldCloseableResource indicates that
>> * only a minority of usages warrant resource control constructions:
>> * those specialized to known resource-bearing instances, or those
>> * that must operate in complete generality.
>> *
>> * <p>For example, most usages of the {@link java.util.stream.Stream}
>> * classes operate on data sources such as an array, {@code
>> * Collection}, or generator function that do not require or benefit
>> * from explicit resource control. However, some uses of IO channels
>> * as data sources do -- a stream operation that opens many files may
>> * exhaust available system resources unless each is closed promptly,
>> * rather than waiting for them to be garbage collected.
>> *
>> * <p>Annotation {@code DefinitelyHoldsCloseableResource} may be used
>> * to guide users deciding whether resource-control constructions are
>> * warranted when using particular implementations of
>> * MayHoldCloseableResource.
>> */
>> public interface MayHoldCloseableResource extends AutoCloseable {
>> /**
>> * Closes this resource, relinquishing any underlying resources.
>> * This method is invoked automatically on objects managed by the
>> * {@code try}-with-resources statement.
>> *
>> * Implementers of this interface are strongly encouraged
>> * to make their {@code close} methods idempotent.
>> *
>> * @see AutoCloseable#close()
>> */
>> @Override
>> void close();
>>
>> /**
>> * Indicates that a variable holding a {@code
>> MayHoldCloseableResource} or
>> * a method returning a {@code MayHoldCloseableResource} definitely
>> does
>> * hold a closeable resource.
>> */
>> @Retention(RetentionPolicy.CLASS)
>> @Documented
>> @Target({ElementType.FIELD, ElementType.LOCAL_VARIABLE,
>> ElementType.METHOD })
>> @interface DefinitelyHoldsCloseableResource { }
>> }
>>
More information about the lambda-libs-spec-experts
mailing list