最終更新:ID:0p+U5ZYhtQ 2010年04月01日(木) 16:03:19履歴
Semicolonless Java はオブジェクト指向言語です。この項ではクラスを宣言し、オブジェクトの使い方を学びます。
Semicolonless Java でのクラス宣言はextends java.util.HashMapとします。X,Yの座標を持つPointクラスの作成を例にクラスの作り方を見ていきましょう。
ここではjava.util.HashMap<Point.Key, Object>としてキーとなる項目を列挙としています。こうすることでより型安全となります。ジェネリクスがよくわからなければraw型のHashMapを用いてもかまいません。
コンストラクタ宣言はJava言語と同じです。インスタンス変数に格納する代わりにthis.put()でインスタンスに情報を格納します。
絶対値を返すメソッドを作ってみましょう。Semicolonless Java ではメソッド宣言をJava言語のエンクロージング型内部クラスで表現します。java.util.HashMapをextendsしたAbsoluteValueクラスを宣言します。キーは型安全にしたければenumにします。
for文でx,yのローカル変数を宣言しています。Point.thisからPointオブジェクトのフィールドを取得しx, yに格納していますね。this.putとしている文が戻り値の設定です。戻り値はこのようにthisオブジェクトへのputで表現します。もうお気づきですね。Semicolonless Java では複数の戻り値を設定することができます。
あるクラスからPointクラスを使う方法を見てみましょう。
ますはfor文でPoint型変数pを作成します。次に、p.new AbsoluteValue()でメソッド呼び出しをします。メソッドの呼出し結果をjava.util.Map型変数resultに受け取っていますね。resultからget()で結果を取得して、この例ではprintfしています。
引数のあるメソッドはどうでしょうか。Pointクラスに回転処理を加えてみましょう。
今度は戻り値のないメソッドですから extends java.util.HashMapとする必要はありません。コンストラクタ引数rx, ryを用いて演算をし、結果をPoint.thisにput()しています。こうすることでインスタンスの情報が更新されるわけです。
さあ、動作を見てみましょう。
メソッドの呼出しはやはりp.newを用います。引数があること、戻り値を利用していないことがAbsoluteValueとの相違点ですね。
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回転処理が行えていることが確認できました。
コメントをかく