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对象就已完全初始化。但让我不要相信这种操纵。如果每次创建对象时我都需要做一件事,那不是一种奇特的逻辑,而是对象初始化。