MAKE VALUE TYPES EASIER TO USE AND EXPLOIT THE TYPE INFERENCE CAPABILITIES Hi! I have some ideas that I think They would be interesting on how to use Values Types. I have two proposal: How to define if? and how to use it? The two are separate proposal. I will write the first proposal.
1.Defining Value Types? A. What about forcing a primary constructor to indicate that it is a value type, there is some thing like it in C#6, but in C# it just to make easy to define a primary constructor. So in Java we can use it differently. So we can say that if we use it that we are defining a value type. It is possible to have more than one explicit constructor. But I don't think that we have to force developer to write a constructor if it is not necessary. Why? According to the document Value-types constructors are really factory methods, so there is no new;dup;init dance in the bytecodes.
So I think that to define a value type we can only do: <p><pre><code> final class Point(int x, int y){
boolean equals(Point p){ return this.x==p.x&&this.y==p.y}
}; </code></pre></p> x and y are automatically final and public members. So that can exactly be compiled like: <p><pre><code> final __ByValue class Point { public final int x; public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public boolean equals(Point that) {
return this.x == that.x && this.y == that.y;
}
}
</code></pre></p>
Simple, concise and contributes to productivity. I also I thought about something new.
We can also do:
<p><pre><code>
final class Point(int x, int y){
private int c;//if I wont
boolean equals(Point p){
return this.x==p.x&&this.y==p.y}
public static Point getFunPoint(){
}
public static void maFunction(Point p, boolean b, double b){
}
}
</code></pre></p>
B. Why not an implicit default equals. So if I do :
<p><pre><code>
final class Point(int x, int y){}
</code></pre></p>
that means if the JVM doesn't find an explicit equals, it cans do logical compare.
<p><pre><code>
public boolean equals(Point that) {
return this.x == that.x && this.y == that.y;
}.
</code></pre></p>
So a Point can be defined in one line:
<p><pre><code>
final class Point(int x, int y){}
</code></pre></p>
C. If we don't want to define something else in a value type, braces can be optional as in lambda expressions :)
So to define a value type we can only do:
<p><pre><code>
final class Point(int x, int y);
</code></pre></p>