RFR: 8017513: Support for closeable streams

Paul Benedict pbenedict at apache.org
Sun Jul 14 21:47:32 PDT 2013


It's a post-condition to using the object. I've emphasized the "must" part
of the contract but the full contract is: "must be closed when it is no
longer needed". That's a pretty clear post-condition language that must be
true. So when you're done with the AutoCloseable type, as in the
post-condition, it must be closed. That's the expected behavior when using
this type.



On Sun, Jul 14, 2013 at 10:53 PM, David Holmes <david.holmes at oracle.com>wrote:

> On 12/07/2013 11:57 PM, Paul Benedict wrote:
>
>> I see closeability as a postcondition. A subtype can't weaken it. The
>> contract of AutoCloseable says its a resource that "must" be closed. Now
>> MHCR says it can/should/doesn't have to be closed -- so it is backwards.
>>
>
> A "postcondition" of what? pre- and post-conditions go with methods.
> "closeability" is an invariant as far as I can see. Hence must be
> maintained in a substitutable subtype - which it is not no matter which way
> you try the inheritance.
>
> David
>
>
>> On Fri, Jul 12, 2013 at 6:22 AM, David Holmes <david.holmes at oracle.com
>> <mailto:david.holmes at oracle.**com <david.holmes at oracle.com>>> wrote:
>>
>>     On 12/07/2013 6:22 AM, Paul Benedict wrote:
>>
>>         Paul S.'s said the "negative" of using AutoCloseable is "it is
>>         no longer
>>         clear whether a stream should be closed or not" (6/20). That's
>>         true because
>>         the semantics of AutoCloseable indicates you have a resource
>>         that requires
>>         closing.
>>
>>         However, the choice to make MayHoldCloseableResource a
>>         sub-interface of
>>         AutoClosable should be resisted. It's an inverted design. The
>> Liskov
>>         *substitution principle *says that sub-interfaces can't loosen
>>         the contracts
>>
>>      > of their superinterface.
>>
>>     Not quite. It says:
>>
>>     - Preconditions cannot be strengthened in a subtype.
>>     - Postconditions cannot be weakened in a subtype.
>>     - Invariants of the supertype must be preserved in a subtype.
>>
>>     Question is: what kind of property is "closeability"?
>>
>>
>>         If anything, AutoCloseable should be subclass of this new
>>         interface, which MIGHT hold a resource that requires closing.
>>         The current
>>         choice is just plainly backwards.
>>
>>
>>     No what you just said is "plainly backwards". If AutoCloseable is a
>>     subtype of MHCR then you should be able to use an AC instance
>>     anywhere you use a MHCR. But valid code doesn't have to close a
>>     MHCR, so if you replace it with an AC which requires closing then
>>     you have broken code. Hence not substitutable, hence invalid
>>     inheritance relationship.
>>
>>     But if anything this is just another variation of the
>>     Square/Rectangle inheritance fallacy. While you can define either as
>>     a specialization of the other, you can always violate
>>     substitutability by doing something that relies on the property that
>>     gets specialized.
>>
>>     David
>>     -----
>>
>>
>>
>>         For the above reason stated, and for the fact the interface adds
>>         no new
>>         functionality, it's superfluous. If the interface relationship
>>         can't be
>>         inverted, then chuck it -- it does nothing anyway. At the least,
>>         keep the
>>         annotation.
>>
>>         Paul
>>
>>
>>         On Thu, Jul 11, 2013 at 3:01 PM, Henry Jen <henry.jen at oracle.com
>>         <mailto:henry.jen at oracle.com>> wrote:
>>
>>             On 07/11/2013 01:13 AM, Florian Weimer wrote:
>>
>>                 On 07/10/2013 11:30 PM, Henry Jen wrote:
>>
>>                     A new interface,
>>                     java.util.__**MayHoldCloseableResource, indicates an
>>                     implementation may or may not hold a resource need
>>                     to be closed.
>>
>>
>>                 Why doesn't close() throw Exception?
>>
>>
>>             Because there is really much a developer can do on that
>>             situation. The
>>             API simply make it not throw a *checked* exception.
>>
>>             See EG discussion on this topic,
>>
>>
>>             http://mail.openjdk.java.net/_**
>> _pipermail/lambda-libs-spec-__**experts/2013-June/002081.html<http://mail.openjdk.java.net/__pipermail/lambda-libs-spec-__experts/2013-June/002081.html>
>>             <http://mail.openjdk.java.net/**pipermail/lambda-libs-spec-**
>> experts/2013-June/002081.html<http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-June/002081.html>
>> >
>>
>>
>>                     Annotation {@link HoldsResource} may be used to
>>                     guide users/static
>>                     analysis tools that a MHCR instance that definitely
>>                     hold a Closeable
>>                     resource.
>>
>>
>>                 All this looks a bit odd to me.  I suppose the idea is
>>                 that you don't
>>                 want to give up the last reference to a closeable
>>                 resource without
>>                 calling close()—and not leak references which out-live
>>                 the call to
>>                 close().  This is definitely not a property of the type
>>                 of the resource,
>>                 so I don't see why the MayHoldCloseableResource
>>                 interface is needed (or
>>                 can confer relevant information).  The HoldsResource
>>                 annotation could be
>>                 useful, but based on the current documentation, it's not
>>                 clear if it is
>>                 actually intended to express the data flow property.
>>
>>
>>             I would suggest you look at EG discussion on this topic. The
>>             MHCR is
>>             different from AutoCloseable on the chances of holding
>>             critical resources.
>>
>>             Perhaps that suggests the javadoc is not clear enough, I
>>             would like to
>>             know what is important and missing.
>>
>>             Cheers,
>>             Henry
>>
>>
>>
>>
>>
>>
>>
>>
>> --
>> Cheers,
>> Paul
>>
>


-- 
Cheers,
Paul


More information about the lambda-dev mailing list