Groovy Devs,

I have been pondering how to automate the writing of try/finally blocks used to 
unconditionally restore object state.  Does anyone know of a Groovier way to do 
something like this before I pursue a macro method, an AST transformation, or 
something more involved?  It currently requires a lot of typing to do this.

Scenario 1: stack-ify a scalar field/property -- often used when traversing a 
list or tree and "state" is the current element

class Foo {
  private state
  def bar() {
    def temp = state // may be any number of fields saved to temp vars
    state = newState
    try {
      baz()
    } finally {
      state = temp
    }
  }
  def baz() {
    // make use of state; does not require previous values
  }
}

Scenario 2: mutation rollback -- similar but "state" is not written to 
beforehand

class Foo {
  private state
  def bar() {
    def temp = state // may be any number of fields saved to temp vars
    try {
      baz()
    } finally {
      state = temp
    }
  }
  def baz() {
    // modifies state
  }
}

Note: "state" is not always convertible into a java.util.Stack.  Sometimes this 
is 3rd-party code that is being extended.



I was thinking of something like this so as not to overload the try keyword:

class Foo {
  def bar() {
    push (field1 = value, field2) { // AST would be re-written to try/finally 
like Scenario 1/2
      baz()
    }
  }
  ...
}

This e-mail is for the sole use of the intended recipient and contains 
information that may be privileged and/or confidential. If you are not an 
intended recipient, please notify the sender by return e-mail and delete this 
e-mail and any attachments. Certain required legal entity disclosures can be 
accessed on our website: 
https://www.thomsonreuters.com/en/resources/disclosures.html

Reply via email to