I would not be too concerned about having to create a new object. I've heard that modern JVMs are really good at detecting temporary objects that don't escape a method and turning them into stack objects.
So I would do something like this (let's assume you really don't want to create new Foo): class FooSession implements Closeable { private final Foo foo FooSession(Foo foo) { this.foo = foo; foo.start(); } void close() { foo.close() } } def a = new Foo() try(new FooSession(a)) { println "1" } There is actually precedence for this in other languages: in C++ with RAII concept one uses the "lock" object pattern to ensure unlocking... as a way to get a kind of forced "finally" concept. However, this still doesn't force the user to use the session. If you want to do that, and you can modify foo, why don't you add a start method to Foo? class Foo { //notice Foo is NOT implements Closeable Closeable start() { println "Hi"; new FooSession(this); } void close() { println "Bye" } } def x = new Foo() try (x.start()) { println "1" } Of course, you could also have the start method take a closure -- if you don't care about seeing try-with-resources directly, then you can make the same pattern: x.start { println "1" } Jason Sensitivity: Internal -----Original Message----- From: o...@ocs.cz <o...@ocs.cz> Sent: Monday, June 1, 2020 8:43 PM To: users@groovy.apache.org Subject: Re: Is there a way for an object to know it _enters_ a try-with-resource block? P.S. Or, it would be quite sufficient to be able to get the list of the closeables inside of the try-with-resource. I mean something like === static List somethingSmart() { ... } ... def a=new Foo(),b=new Foo(),c=new Foo() try (a) { assert somethingSmart()==[a] } try (b,c) { assert somethingSmart()==[b,c] } === Does Java or Groovy allow to write such kind of “somethingSmart”? How? Thanks, OC > On 2. 6. 2020, at 2:28 AM, o...@ocs.cz wrote: > > Is there some trick which would, with a proper replacement of ???, ensure > that the following code: > > === > class Foo { > void ???() { println "Hi" } > void close() { println "Bye" } > } > ... > def foo=new Foo() > println "1" > try (foo) { println "2" } > println "3" > try (foo) { println "4" } > println "5" > === > > prints out 1,Hi,2,Bye,3,Hi,4,Bye,5? > > I'd rather like not to create a new foo object for each try block (which of > course would be sorta-solution); it would be _considerably_ more convenient > to reuse it -- if there was a way for that to know it enters the try block. > > Thanks! > OC >