Java 围绕超细粉碎工作

Java 围绕超细粉碎工作,java,constructor,restrictions,jls,defensive-programming,Java,Constructor,Restrictions,Jls,Defensive Programming,这里,AsciiChecker启用文本形式的矩阵规范 abstract class AsciiChecker extends AlgoritmicChecker { String[] ascii; AsciiChecker(String title, final String ... ascii) { super(title, ascii[0].length(), ascii.length); // calls isCovered }; bo

这里,
AsciiChecker
启用文本形式的矩阵规范

abstract class AsciiChecker extends AlgoritmicChecker {

    String[] ascii;

    AsciiChecker(String title, final String ... ascii) {
        super(title, ascii[0].length(), ascii.length); // calls isCovered
    };

    boolean isCovered(int test, int statement) {
        return ascii[statement].charAt(test) == '1';
    }           
}
它需要矩阵参数在
isCovered
调用中可用。告诉我如果我在使用前初始化了场,我该如何射击腿

    AsciiChecker(String title, final String ... ascii) {
        this.ascii = ascii;
        super(title, ascii[0].length(), ascii.length); // calls isCovered
    };

如果您的超类正在使用数组中的数据,请向上拉
String[]ascii
到超类,在那里初始化此字段,并在
isCovered
中通过getter访问它或修改
isCovered
的签名,并将适当的数组作为参数传递。

您需要摆脱超类中可重写方法的调用。摘自有效Java,第18项:

将每个可重写方法的主体移动到私有“helper方法” 并让每个可重写方法调用其私有助手方法。 然后将可重写方法的每次自我使用替换为直接 调用可重写方法的私有助手方法


//发现调用
->代码的哪一部分调用它?我们看不到任何这样的调用。这部分代码称为构造函数。构造函数是一个可以调用其他方法的方法。它调用的方法之一是
isCovered()
。如果您仍然无法想象它,请将super()想象为宽度为x,高度为y的每个y的打印(isCovered(x,y))。抱歉,我仍然无法想象。您正在从超类构造函数调用
isCovered()
方法吗?这就是构造函数不应该调用可重写方法的原因!你能证明调用overridable比在超级构造函数之前初始化扩展字段更糟糕吗?
Ascii
Algoritic
类之间的区别在于
Algoritic
的操作不需要Ascii数组。将所有垃圾拉入基类是很糟糕的。也许我们应该把所有东西都放到java.Object中?如何调用此模式?您必须从构造函数中排除
验证
逻辑,并在超类中声明验证方法,并在创建对象(并初始化ascii字段)后从外部调用它,或重新定义超类coustructor以允许传递其他参数。如果这不符合您的需要或想法,那么您必须重新设计您的类。我认为最大的缺点(也是最大的障碍)是您在超级构造函数中有不必要的登录-将其提取到方法中。这也是我不喜欢Java OOP的地方。他们说构造函数不能做所有的构造,Java就是这样工作的,我们必须处理它。无论如何,我认为这是一个不错的设计。构造函数用于初始化对象,而不是执行一些奇特的逻辑(如验证、连接到外部资源等)。此外,禁止抱怨必须在构造函数之外进行初始化,因为根据定义,一旦构造函数退出,java对象就已完全初始化。但让我不要相信这种操纵。如果每次创建对象时我都需要做一件事,那不是一种奇特的逻辑,而是对象初始化。