Name: jl125535			Date: 07/10/2003
DESCRIPTION OF THE REQUEST :
Here's a thought for a feature to add to the language.  In
C++, it is often convenient to attach a clean-up action to
the destructor of a class so that when a stack-allocated
instance of that class goes out of scope, the clean-up
action is executed automatically.
Typical uses are for File open/close, Lock acquire/release,
Log enter/exit, Variable increment/decrement,  and in C++,
malloc/free.
However in Java, objects never have so-called 'automatic'
lifetime, and nor do they have (synchronous) destructors;
but Java has the somewhat similar try { .. } finally
mechanism, and has the special case 'synchronized(e) {..}'
for locks.
Therefore I propose the following small, compatible (except
for new keyword 'auto') addition to the compiler and
library, which generalises the 'synchronized' statement for
arbitrary interfaces.  The syntactic benefit is I hope,
obvious, by analogy with the synchronized statement.
// this goes in java.lang
interface Automatic {
    void start();
    void stop();
}
// example implementation class
class Trace implements Automatic {
    public void start() { System.out.println("start"); }
    public void stop()  { System.out.println("stop");  }
}
// example use:
class s
{
    // you write:
    public static void main(String[] args) {
        Trace tr = new Trace();
        auto(tr) { // argument must implement Automatic
            if(args.length == 0) return;
            System.out.println("here");
        }
    }
    // the compiler desugars this to:
    public static void main(String[] args) {
        Trace tr =  new Trace();
        Automatic auto$0 = tr;
        try {
            auto$0.start();
            if(args.length == 0) return;
            System.out.println("here");
        }
        finally {
            auto$0.stop();
        }
    }
}
So the additional syntax as shown here is a statement of the
form:
    auto(EXPR) BLOCK
In addition it would be nice to support the form:
    auto(EXPR);
also, which would implicitly use the remainder of the block
as the BLOCK argument.  This permits even more localised
code changes.  e.g.
void f() {
    auto(new Trace());
    /* this is the block */
}
(The most obvious objection I can see is the 'kitchen sink'
argument).
(Review ID: 181875) 
======================================================================