Tweeted twitter.com/#!/StackProgrammer/status/446692354444259329
3 Fixed code formatting
source | link

I have pastepasted the codescode here,:

> 
>publicpublic class Shape {
>     
>  private final double opacity;
> 
>     public static class Builder<T extends Builder<T>> {
>         private double opacity;
> 
>         public T opacity(double opacity) {
>             this.opacity = opacity;
>             return self();
>         }
> 
> /*
>         public T height(double height) {
>             System.out.println("height not set");
>             return self();
>         }
> */
>         protected T self() {
>             System.out.println("shape.self -> " + this);
>             return (T) this;
>         }
> 
>         public Shape build() {
>             return new Shape(this);
>         }
>     }
> 
>     public static Builder<?> builder() {
>         return new Builder();
>     }
> 
>     protected Shape(Builder builder) {
>         this.opacity = builder.opacity;
>     } 
 }
> 
> public class Rectangle extends Shape {
>     private final double height;
> 
>     public static class Builder<T extends Builder<T>> extends Shape.Builder<T> {
>         private double height;
> 
>         public T height(double height) {
>             System.out.println("height is set");
>             this.height = height;
>             return self();
>         }
> 
>         public Rectangle build() {
>             return new Rectangle(this);
>         }
>     }
> 
>     public static Builder<?> builder() {
>         return new Builder();
>     }
> 
>     protected Rectangle(Builder builder) {
>         super(builder);
>         this.height = builder.height;
>     }
> 
>     public static void main(String[] args) {
>         Rectangle r = Rectangle.builder().opacity(0.5).height(250).build();
>     }  
}

I have paste the codes here,

> 
>public class Shape {
>     
>  private final double opacity;
> 
>     public static class Builder<T extends Builder<T>> {
>         private double opacity;
> 
>         public T opacity(double opacity) {
>             this.opacity = opacity;
>             return self();
>         }
> 
> /*
>         public T height(double height) {
>             System.out.println("height not set");
>             return self();
>         }
> */
>         protected T self() {
>             System.out.println("shape.self -> " + this);
>             return (T) this;
>         }
> 
>         public Shape build() {
>             return new Shape(this);
>         }
>     }
> 
>     public static Builder<?> builder() {
>         return new Builder();
>     }
> 
>     protected Shape(Builder builder) {
>         this.opacity = builder.opacity;
>     } }
> 
> public class Rectangle extends Shape {
>     private final double height;
> 
>     public static class Builder<T extends Builder<T>> extends Shape.Builder<T> {
>         private double height;
> 
>         public T height(double height) {
>             System.out.println("height is set");
>             this.height = height;
>             return self();
>         }
> 
>         public Rectangle build() {
>             return new Rectangle(this);
>         }
>     }
> 
>     public static Builder<?> builder() {
>         return new Builder();
>     }
> 
>     protected Rectangle(Builder builder) {
>         super(builder);
>         this.height = builder.height;
>     }
> 
>     public static void main(String[] args) {
>         Rectangle r = Rectangle.builder().opacity(0.5).height(250).build();
>     } }

I have pasted the code here:

public class Shape {

  private final double opacity;

     public static class Builder<T extends Builder<T>> {
         private double opacity;

         public T opacity(double opacity) {
             this.opacity = opacity;
             return self();
         }

 /*
         public T height(double height) {
             System.out.println("height not set");
             return self();
         }
 */
         protected T self() {
             System.out.println("shape.self -> " + this);
             return (T) this;
         }

         public Shape build() {
             return new Shape(this);
         }
     }

     public static Builder<?> builder() {
         return new Builder();
     }

     protected Shape(Builder builder) {
         this.opacity = builder.opacity;
     } 
 }

 public class Rectangle extends Shape {
     private final double height;

     public static class Builder<T extends Builder<T>> extends Shape.Builder<T> {
         private double height;

         public T height(double height) {
             System.out.println("height is set");
             this.height = height;
             return self();
         }

         public Rectangle build() {
             return new Rectangle(this);
         }
     }

     public static Builder<?> builder() {
         return new Builder();
     }

     protected Rectangle(Builder builder) {
         super(builder);
         this.height = builder.height;
     }

     public static void main(String[] args) {
         Rectangle r = Rectangle.builder().opacity(0.5).height(250).build();
     } 
}
2 fix layout
source | link

public class Shape {

private final double opacity;

public static class Builder<T extends Builder<T>> {
    private double opacity;

    public T opacity(double opacity) {
        this.opacity = opacity;
        return self();
    }

/* public T height(double height) { System.out.println("height not set"); return self(); } */ protected T self() { System.out.println("shape.self -> " + this); return (T) this; }

    public Shape build() {
        return new Shape(this);
    }
}

public static Builder<?> builder() {
    return new Builder();
}

protected Shape(Builder builder) {
    this.opacity = builder.opacity;
} }

public class Rectangle extends Shape { private final double height;

public static class Builder<T extends Builder<T>> extends Shape.Builder<T> {
    private double height;

    public T height(double height) {
        System.out.println("height is set");
        this.height = height;
        return self();
    }

    public Rectangle build() {
        return new Rectangle(this);
    }
}

public static Builder<?> builder() {
    return new Builder();
}

protected Rectangle(Builder builder) {
    super(builder);
    this.height = builder.height;
}

public static void main(String[] args) {
    Rectangle r = Rectangle.builder().opacity(0.5).height(250).build();
} }
> 
>public class Shape {
>     
>  private final double opacity;
> 
>     public static class Builder<T extends Builder<T>> {
>         private double opacity;
> 
>         public T opacity(double opacity) {
>             this.opacity = opacity;
>             return self();
>         }
> 
> /*
>         public T height(double height) {
>             System.out.println("height not set");
>             return self();
>         }
> */
>         protected T self() {
>             System.out.println("shape.self -> " + this);
>             return (T) this;
>         }
> 
>         public Shape build() {
>             return new Shape(this);
>         }
>     }
> 
>     public static Builder<?> builder() {
>         return new Builder();
>     }
> 
>     protected Shape(Builder builder) {
>         this.opacity = builder.opacity;
>     } }
> 
> public class Rectangle extends Shape {
>     private final double height;
> 
>     public static class Builder<T extends Builder<T>> extends Shape.Builder<T> {
>         private double height;
> 
>         public T height(double height) {
>             System.out.println("height is set");
>             this.height = height;
>             return self();
>         }
> 
>         public Rectangle build() {
>             return new Rectangle(this);
>         }
>     }
> 
>     public static Builder<?> builder() {
>         return new Builder();
>     }
> 
>     protected Rectangle(Builder builder) {
>         super(builder);
>         this.height = builder.height;
>     }
> 
>     public static void main(String[] args) {
>         Rectangle r = Rectangle.builder().opacity(0.5).height(250).build();
>     } }

public class Shape {

private final double opacity;

public static class Builder<T extends Builder<T>> {
    private double opacity;

    public T opacity(double opacity) {
        this.opacity = opacity;
        return self();
    }

/* public T height(double height) { System.out.println("height not set"); return self(); } */ protected T self() { System.out.println("shape.self -> " + this); return (T) this; }

    public Shape build() {
        return new Shape(this);
    }
}

public static Builder<?> builder() {
    return new Builder();
}

protected Shape(Builder builder) {
    this.opacity = builder.opacity;
} }

public class Rectangle extends Shape { private final double height;

public static class Builder<T extends Builder<T>> extends Shape.Builder<T> {
    private double height;

    public T height(double height) {
        System.out.println("height is set");
        this.height = height;
        return self();
    }

    public Rectangle build() {
        return new Rectangle(this);
    }
}

public static Builder<?> builder() {
    return new Builder();
}

protected Rectangle(Builder builder) {
    super(builder);
    this.height = builder.height;
}

public static void main(String[] args) {
    Rectangle r = Rectangle.builder().opacity(0.5).height(250).build();
} }
> 
>public class Shape {
>     
>  private final double opacity;
> 
>     public static class Builder<T extends Builder<T>> {
>         private double opacity;
> 
>         public T opacity(double opacity) {
>             this.opacity = opacity;
>             return self();
>         }
> 
> /*
>         public T height(double height) {
>             System.out.println("height not set");
>             return self();
>         }
> */
>         protected T self() {
>             System.out.println("shape.self -> " + this);
>             return (T) this;
>         }
> 
>         public Shape build() {
>             return new Shape(this);
>         }
>     }
> 
>     public static Builder<?> builder() {
>         return new Builder();
>     }
> 
>     protected Shape(Builder builder) {
>         this.opacity = builder.opacity;
>     } }
> 
> public class Rectangle extends Shape {
>     private final double height;
> 
>     public static class Builder<T extends Builder<T>> extends Shape.Builder<T> {
>         private double height;
> 
>         public T height(double height) {
>             System.out.println("height is set");
>             this.height = height;
>             return self();
>         }
> 
>         public Rectangle build() {
>             return new Rectangle(this);
>         }
>     }
> 
>     public static Builder<?> builder() {
>         return new Builder();
>     }
> 
>     protected Rectangle(Builder builder) {
>         super(builder);
>         this.height = builder.height;
>     }
> 
>     public static void main(String[] args) {
>         Rectangle r = Rectangle.builder().opacity(0.5).height(250).build();
>     } }
1
source | link

Java Method Returns Unbounded Type

I was reading this article, https://weblogs.java.net/blog/emcmanus/archive/2010/10/25/using-builder-pattern-subclasses, about subclassing a builder class. I understood the article but there was one small bit that bothered me. There was this method,

public static Builder<?> builder() {
        return new Builder2();
}

When I changed Builder<?> to Builder, a raw type, the compiler would not compile the code. What is the additional information was passed to the compiler via with the additional <?>?

I have paste the codes here,

public class Shape {

private final double opacity;

public static class Builder<T extends Builder<T>> {
    private double opacity;

    public T opacity(double opacity) {
        this.opacity = opacity;
        return self();
    }

/* public T height(double height) { System.out.println("height not set"); return self(); } */ protected T self() { System.out.println("shape.self -> " + this); return (T) this; }

    public Shape build() {
        return new Shape(this);
    }
}

public static Builder<?> builder() {
    return new Builder();
}

protected Shape(Builder builder) {
    this.opacity = builder.opacity;
} }

public class Rectangle extends Shape { private final double height;

public static class Builder<T extends Builder<T>> extends Shape.Builder<T> {
    private double height;

    public T height(double height) {
        System.out.println("height is set");
        this.height = height;
        return self();
    }

    public Rectangle build() {
        return new Rectangle(this);
    }
}

public static Builder<?> builder() {
    return new Builder();
}

protected Rectangle(Builder builder) {
    super(builder);
    this.height = builder.height;
}

public static void main(String[] args) {
    Rectangle r = Rectangle.builder().opacity(0.5).height(250).build();
} }