[2017] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/05 20:16:43
おくればせながら、正誤表の追加とソースの訂正、ありがとうございました。おそれいりますが、またいくつかきづいてしまいましたので、ふたたびご面倒をおかけします。今回も当方の勘違いがありましたらお許しください。 (才能に乏しいようでなかなか理解がすすみませんが、趣味としてこつこつやっております。)
まずは、またもや細かいことですみませんが……。 p. 147 の英文で [emphasis is in the original text] とあるのが反映されていません。和訳の方はされています。また、和訳の方で「どのオブジェクトも参照しない特殊なnull参照」に相当する英文がないです。
X-Draw のソースで DrawWindow.java の l. 110 -
public void mouseDown(int x, int y) {}
public void mouseUp(int x, int y) {}
public void mouseDrag(int x, int y) {}
は不要と思われます。
あと、 l. 164 -
public void resize(int width, int height) {
this.adjustBoundary();
}
ですが、今後の拡張を見込んでこのようにされたのでしょうか。
3.6.7 「本当にdraw()をShapeに入れてよいのか?」が、コードを実地にかいてみることでようやくわかってきました。それできづいたのですが、 p.227 の interface Visitor の三つのシグネチャーの頭に void がいるかと。また、 p.228 の
v.visitPolyline(polyline);
は実際には
v.visitPolyline(this);
になるかと。
ちなみに、つぎのようにかきましたが、これで適当でしょうか。(Polyline たちから draw() を排除するかわりに getter をいれなければならなくなったのがどうも……。)
class Polyline extends Shape {
private Point2D[] points;
Polyline(Point2D[] points) {
this.points = points;
}
public Point2D[] getPoints() {
return this.points;
}
void accept(Visitor v) {
v.visitPolyline(this);
}
}
// Circle, Rectangle は略
class DrawVisitor implements Visitor {
Drawable drawable;
DrawVisitor(Drawable drawable) {
this.drawable = drawable;
}
public void visitPolyline(Polyline polyline) {
Point2D[] points = polyline.getPoints();
for (int i = 0; i < points.length - 1; i++) {
drawable.drawLine(points[i].getX(), points[i].getY(), points[i + 1].getX(), points[i + 1].getY());
}
}
// visitCircle(), visitRectangle() は略
}
XDrawCanvas の paint() の
shape.draw(this.drawWindow);
を
shape.accept(new DrawVisitor(this.drawWindow));
に変更。
その他、まだ消化しきれていないこともありますので、今後もご面倒をおかけしてしまうかもしれませんが、どうぞよろしくお願いします。