RFR: 8017513: Support for closeable streams
David Holmes
david.holmes at oracle.com
Sun Jul 14 20:53:06 PDT 2013
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>> 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>
>
>
> 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
More information about the lambda-dev
mailing list