Hi,

Due to other commitments I have only skim read read all the thread on 
tuples, pairs (and skipped bits).  But I thought I would throw up an 
alternative (that has almost certainly be suggested before somewhere).  
It is an obvious hijack of C/C++ structs (I don't know C# structs so 
might be the same as that).  Certainly nothing out of the ordinary - but 
to me that is the goal.  Something simple and easy to understand.

Instead of tuples with members named by index, why not introduce structs 
with the following behavior.  (My rationale is I like multiple value 
returns, but I dislike having to remember the first value is A, the 
second value is B, and oh - what happens if they are both int's but the 
programmer reverses the order.  No compile time errors, just brokent code.

So my variation (trying to keep things simple) is:

    * A struct is NOT an object.  It has no methods.  It does not
      inherit from Object.  It does not have .equals().
    * Structs are declared at the same scope as classes (i.e. can be
      global, or nested, just like classes)
    * Structs are defined by a list of fields (no methods)
          o struct MyStruct { int a; List<Object> B };
    * Structs have 2 automatic constructors defined
          o One zero argument constructor - MyStruct(); - uses default
            initializers for all members, and is the default initializer
            for a non-initialized variable declared with a struct type.
          o One constructor with an argument per field - MyStruct(3, new
            List<Object>());
    * Structs are not objects - you do not use 'new'.  Internally they
      are implemented just like declaring all the variables in the
      struct yourself.
    * Passing a struct as an argument to a function internally is
      implemented with the same semantics as passing all the fields
      individually - that is, struct contents are copied
    * Returning a struct is like having a multi-valued return from a
      function (not in Java at present).  All the values are on the stack.
    * All the semantics of default initialization, copying, etc for
      structs is the same as doing those operations on the individual
      members
    * Probably cannot use a struct type as a generic parameter - that
      might be too hard to do in practice (currently generic parameters
      have to be Objects) - so a struct is more like a primitive type
      like 'int' and 'double' than an object.

I like structs over tuples as you get meaningful names for the members.  
struct Point { int x; int y; }  The caller also does not need to worry 
if the members of the struct change, since they access by meaningful name.

Example code

struct Point { int x; int y; }

class Rectangle {
  private Point upperLeft;
  private Point lowerRight;
  public Rectangle(Point uppertLeft, Point lowerRight) {
    this.upperLeft = upperLeft;
    this.lowerRight = lowerRight;
  }
  public Point centroid() {
    return Point((lowerRight.x - upperLeft.x) / 2, (lowerRight.y - 
upperLeft.y) / 2));
  }
}

...
    Rectangle r = new Rectangle(Point(1, 1), Point(3, 3));
    Point c = r.centroid();
    System.out.println("Centroid is " + c.x + ", " + c.y);
...

I doubt this would make a simple language feature list though - too much 
debate about how object like a struct should be I bet!

Another variation is to call it a tuple, but mandate tuples have named 
fields.  Giving the tuple a name (that is, calling it a struct) was 
useful if you did not have implicit declarations - you can reuse the 
type name easily.

Sorry, this is probably a repeat of previous stuff.  But I really 
dislike unnamed members of tuples from a code maintenance perspective, 
which prompted this post.

Alan

--~--~---------~--~----~------------~-------~--~----~
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