我想做的是创建一个使用Builder模式的类(Square
),然后将该类扩展为需要使用的对象(MyCube
)中的内部类(DrawMyCube
)。
由于有些复杂的原因,最好将它们扩展为内部类(对局部变量的引用)。
我试图使该示例尽可能简单,因为实际用例太复杂而无法在此处使用:
public abstract class Square {
protected Integer length;
protected Integer width;
public abstract static class Builder {
protected Integer length;
protected Integer width;
public abstract Builder length(Integer length);
public abstract Builder width(Integer width);
}
protected Square(Builder builder) {
this.length = builder.length;
this.width = builder.width;
}
}
现在我需要在这里扩展和使用它:
public class DrawMyCube {
private String myText;
private Integer height;
private String canvas;
private MyCube myCube;
public DrawMyCube(String canvas) {
this.canvas = canvas;
myCube = new MyCube.Builder().length(10).width(10).text("HolaWorld").build();
}
public void drawRoutine() {
myCube.drawMe(canvas);
}
protected class MyCube extends Square {
protected String text;
public static class Builder extends Square.Builder{
protected String text;
public Square.Builder length(Integer length) {this.length = length; return this;}
public Square.Builder width(Integer width) {this.width = width; return this;}
public Square.Builder text(String text) {this.text = text; return this;}
}
protected MyCube(Builder builder) {
super(builder);
this.text = text;
}
protected void drawMe(String canvas) {
canvas.equals(this);
}
}
}
但是问题是内部类中的静态Builder:
成员类型Builder不能声明为静态;静态类型可以
仅在静态或顶级类型中声明。
或者,我可以将内部类MyCube
创建为常规类,但问题是我无法引用回DrawMyCube
类内部的任何内容(在实际用例中,有很多引用涉及到这些内部引用)。
java大神给出的解决方案
静态嵌套类只能在静态上下文中声明,这就是为什么您看到该编译器错误的原因。只需将您的Builder类声明为与MyCube
相邻(或在静态上下文中的任何其他位置,都没有关系)。例如:
public class DrawMyCube {
protected class MyCube extends Square { }
public static class MyCubeBuilder extends Square.Builder { }
}
请注意,构建器将需要引用外部DrawMyCube
实例以实例化新的MyCube
。因此,您可以将其设为MyCube
的内部(非静态)类:
public class DrawMyCube {
protected class MyCube extends Square { }
public class MyCubeBuilder extends Square.Builder { }
}
如您所见,我仍然在MyCube
旁边声明它,因为将构建器作为其构建内容的内部类根本没有意义。
编辑:正如您提到的,一个简单的替代方法是使MyCube
静态:
public class DrawMyCube {
protected static class MyCube extends Square {
public static class Builder extends Square.Builder { }
}
}
因为说实话,使用内部类并没有什么好处-仅使用隐式外部实例引用-这将使您保留现有的层次结构和命名约定。您可以轻松地自己实现对外部DrawMyCube
的引用-只需多一点代码即可。
附带说明一下,您可能要使用泛型来实现构建器模式,例如,抽象的Builder<T>
,其中实现会构建T
的实例。实际上,将没有办法缩小派生的生成器类产生的结果。这是我要提示的草图:
abstract class Square { }
abstract class SquareBuilder<T extends Square> { }
class MyCube extends Square { }
class MyCubeBuilder extends SquareBuilder<MyCube> { }
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Java-如何将此字符串转换为日期? - java我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…
从方法返回数组-Java - javaprivate static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…
Java Swing SearchBox模型 - java我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。
JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…