[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));
に変更。
その他、まだ消化しきれていないこともありますので、今後もご面倒をおかけしてしまうかもしれませんが、どうぞよろしくお願いします。