In 219 there was a long discussion about setting up an object and then
making it immutable. There are a couple of ways of doing this in Java
already:

public class FooArgs {
  public int x = 1; // 1 is default
  public int y = 2;
  public int z = 3;
  ...
}

public class Foo {
  public Foo( FooArgs args ) { ... }
  ...
}

  Foo foo = new Foo( new FooArgs() {{ x = 2 }} );

Another option is an immutable and mutable versions that inherit from
a common base and implement a standard conversion interface. First the
standard interface:

public interface ImmutableValueConversions {
  Immutable toImmutable() throws IllegalStateException;
  Value toValue();
}

Below is an integer example that uses an abstract class as the base of
the hierarchy. You can also use interfaces. The abstract class is:

    8:public abstract class AbstractInteger extends AbstractValue
    9:    implements ImmutableValueConversions, InstanceFactory {
   10:    public abstract int getValue();
   11:
   12:    public abstract AbstractInteger instanceOfSelf( int value );
   13:
   14:    public AbstractInteger add( final int rhs ) {
   15:        return instanceOfSelf( getValue() + rhs );
   16:    }
   17:}

Then the immutable version:

    9:public final class ImmutableInteger2 extends AbstractInteger
   10:    implements Immutable {
   11:    private final int value;
   12:
   13:    public ImmutableInteger2( final int value ) {
   14:        this.value = value;
   15:    }
   16:
   17:    public int getValue() {
   18:        return value;
   19:    }
   20:
   21:    public Immutable toImmutable() {
   22:        return this;
   23:    }
   24:
   25:    public Value toValue() {
   26:        return new ValueInteger( value );
   27:    }
   28:
   29:    public AbstractInteger instanceOfSelf( final int value ) {
   30:        return new ImmutableInteger2( value );
   31:    }
   38:}

And the value version:

    9:public final class ValueInteger extends AbstractInteger {
   10:    // Not final, this is the value version
   11:    private int value;
   12:
   13:    public ValueInteger( final int value ) {
   14:        this.value = value;
   15:    }
   16:
   17:    public int getValue() {
   18:        return value;
   19:    }
   20:
   21:    // Setter, this is the value version!
   22:    public void setValue( final int value ) {
   23:        this.value = value;
   24:    }
   25:
   26:    public Immutable toImmutable() {
   27:        return new ImmutableInteger2( value );
   28:    }
   29:
   30:    public Value toValue() {
   31:        return new ValueInteger( value );
   32:    }
   33:
   34:    public AbstractInteger instanceOfSelf( final int value ) {
   35:        return new ValueInteger( value );
   36:    }
   37:
   38:    // Set and add combined (+=), this is the value version!
   39:    public ValueInteger setAdd( final int rhs ) {
   40:        value += rhs;
   41:        return this;
   42:    }
   49:}

Then you can use these classes like this:

  ImmutableInteger i = (ImmutableInteger)( new ValueInteger().setValue
( 2 ).toValue() );

My own pet project, PEC, is an extensible compiler that can enforce
patterns, the above immutable pattern can be enforced. More details
from:

  http://pec.dev.java.net/nonav/frontpage.html

What do others do?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "The 
Java Posse" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/javaposse?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to