Java VM上で動くJavaのサブセット Semicolonless Java の公式ページ

 Semicolonless Java はオブジェクト指向言語です。この項ではクラスを宣言し、オブジェクトの使い方を学びます。

クラスの宣言


 Semicolonless Java でのクラス宣言はextends java.util.HashMapとします。X,Yの座標を持つPointクラスの作成を例にクラスの作り方を見ていきましょう。

public class Point extends java.util.HashMap<Point.Key, Object> {
	public enum Key {
		X,
		Y,
	}

	public Point() {}
	public Point(double x, double y) {
		if (null == this.put(Key.X, x)) {}
		if (null == this.put(Key.Y, y)) {}
	}
}

 ここではjava.util.HashMap<Point.Key, Object>としてキーとなる項目を列挙としています。こうすることでより型安全となります。ジェネリクスがよくわからなければraw型のHashMapを用いてもかまいません。

 コンストラクタ宣言はJava言語と同じです。インスタンス変数に格納する代わりにthis.put()でインスタンスに情報を格納します。

メソッドの宣言


 絶対値を返すメソッドを作ってみましょう。Semicolonless Java ではメソッド宣言をJava言語のエンクロージング型内部クラスで表現します。java.util.HashMapをextendsしたAbsoluteValueクラスを宣言します。キーは型安全にしたければenumにします。

public class Point extends java.util.HashMap<Point.Key, Object> {
	// (中略)

	public enum AbsoluteValueKey {
		AbsoluteValue,
	}
	public class AbsoluteValue extends java.util.HashMap<Point.AbsoluteValueKey, Double> {
		public AbsoluteValue() {
			for (double x : new double[]{(Double) Point.this.get(Key.X)}) {
				for (double y : new double[]{(Double) Point.this.get(Key.Y)}) {
					if (null==this.put(AbsoluteValueKey.AbsoluteValue, Math.sqrt(x * x + y * y))){}
				}
			}
		}
	}
}

 for文でx,yのローカル変数を宣言しています。Point.thisからPointオブジェクトのフィールドを取得しx, yに格納していますね。this.putとしている文が戻り値の設定です。戻り値はこのようにthisオブジェクトへのputで表現します。もうお気づきですね。Semicolonless Java では複数の戻り値を設定することができます。

メソッドの呼出し方


 あるクラスからPointクラスを使う方法を見てみましょう。

public class UsePoint {
	public static void main(String[] args) {
		for (Point p : new Point[]{new Point(3, 4)}) {
			for (java.util.Map result : new java.util.Map[]{p.new AbsoluteValue()}) {
				if (null==System.out.printf("%e\n",
					(Double) result.get(Point.AbsoluteValueKey.AbsoluteValue))) {}
			}
		}
	}
}

 ますはfor文でPoint型変数pを作成します。次に、p.new AbsoluteValue()でメソッド呼び出しをします。メソッドの呼出し結果をjava.util.Map型変数resultに受け取っていますね。resultからget()で結果を取得して、この例ではprintfしています。

引数のあるメソッド


 引数のあるメソッドはどうでしょうか。Pointクラスに回転処理を加えてみましょう。

public class Point extends java.util.HashMap<Point.Key, Object> {
	// (中略)

	public class Rotate {
		public Rotate(double rx, double ry) {
			for (double x : new double[]{(Double) Point.this.get(Key.X)}) {
				for (double y : new double[]{(Double) Point.this.get(Key.Y)}) {
					if (null==Point.this.put(Key.X, x * rx - y * ry)) {}
					if (null==Point.this.put(Key.Y, x * ry - rx * y)) {}
				}
			}
		}
	}
}

 今度は戻り値のないメソッドですから extends java.util.HashMapとする必要はありません。コンストラクタ引数rx, ryを用いて演算をし、結果をPoint.thisにput()しています。こうすることでインスタンスの情報が更新されるわけです。

 さあ、動作を見てみましょう。

public class UsePoint {
	public static void main(String[] args) {
		for (Point p : new Point[]{new Point(3, 4)}) {
			if (null==p.new Rotate(0.0, 1.0)){}
			if (null==System.out.printf("%e\n", p.get(Point.Key.X))){}
			if (null==System.out.printf("%e\n", p.get(Point.Key.Y))){}
		}
	}
}

 メソッドの呼出しはやはりp.newを用います。引数があること、戻り値を利用していないことがAbsoluteValueとの相違点ですね。

-4.000000e+00
3.000000e+00
 回転処理が行えていることが確認できました。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

【メニュー編集】

どなたでも編集できます