-->

2015年06月

クラスの基本はこんな感じだ。

class Hoge {
    // プロパティ
    var hoge:Int = 3
    var hoge2:Int
    // ゲッター、セッター
    var hoge3:Int {
        get {
            return hoge2 * 3
        }
        set {
            hoge2 = newValue / 3
        }
    }
    
    // イニシャライザ
    init(hoge2:Int) {
        self.hoge2 = hoge2
    }
    
    // デイニシャライザ
    deinit {
        println("deinit")
    }
    
    // メソッド
    func methodHoge() -> Int {
        return self.hoge
    }
}

// インスタンスの生成
var hoge = Hoge(hoge2:30)   // イニシャライザでは、ラベルが必要なんだな
println(hoge.hoge2)         // 30と表示
hoge.hoge2 = 60
println(hoge.hoge2)         // 60と表示
println(hoge.hoge3)         // hoge3のゲッターが呼ばれるんで
                            // 180と表示
hoge.hoge3 = 30             // hoge3のセッターが呼ばれて、hoge2に10が設定される
println(hoge.hoge2)         // 10と表示

println(hoge.methodHoge())  // 3と表示
hoge = Hoge(hoge2:22)       // ここで最初のインスタンスが破棄されるのでデイニシャライザが実行されて
                            // deinitと表示
println(hoge.hoge2)
println("END")

プロパティ、メソッドは、それぞれ変数の宣言と関数の宣言と同じだ。
プロパティは、C#みたいに取得するときに呼ばれる処理、設定するときに呼ばれる処理が書ける。setを省略するとリードオンリーのプロパティになる。
イニシャライザ、デイニシャライザはC++のコンストラクタ、デストラクタに相当する。


このエントリーをはてなブックマークに追加

自分自身のjarファイルの位置はSystem.getProperty("java.class.path")で取れる。けど、相対パスになることがあるから、FileをPathやらを使って絶対パスを取得する。

package testjarpath;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

public class TestJarPath {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // classパスを取得
        // jarならjarファイル名
        String jar_path = System.getProperty("java.class.path");
        System.out.println(jar_path);
        // ↑これだと、相対パスになることがある。
        // ので、絶対パスを取得する。
        File jar_file = new File(jar_path);
        String jar_path2 = jar_file.getAbsolutePath();
        System.out.println(jar_path2);
        // ↑ これでも中途半端。"/tmp/./TestJarPath.jar"みたいになる。
        
        // ↓ normalize()で正規化する。
        Path path = Paths.get(jar_file.getAbsolutePath());
        String jar_path3 = path.normalize().toString();
        System.out.println(jar_path3);
    }
    
}

このエントリーをはてなブックマークに追加

for文で全要素にアクセスする方法で追加。
要素番号こみで各要素にアクセする方法だ。

var hoge = ["hoge1", "hoge2", "hoge3"]
for (index, val) in enumerate(hoge) {
    println("hoge[\(index)] = \(val)")
}
// hoge[0] = hoge1
// hoge[1] = hoge2
// hoge[2] = hoge3
// って、表示。

このエントリーをはてなブックマークに追加

変数宣言の型の後に!を付けることでもnilを代入できるようになる。この場合、nilも値も普通に代入できる。(コンパイルエラーにならない)
nilを代入したまま、メソッド呼んだり、プロパティ参照したりすると、そこでプログラムの実行が止まる。

var hoge:String! = "abc"

println(hoge)   // "123"と表示

hoge = nil
println(hoge)   // "nil"と表示

println(hoge.uppercaseString)   // ここで止まる

どっちにしろ、nilかどうかをチェックしないといけないのでこの方法は使わず、変数宣言で?を指定しておいて、値を参照する場合は、if let 〜{}を使うようにするのが、nilチェック忘れをコンパイル時にわかるのでいいんじゃないかな。


このエントリーをはてなブックマークに追加

JavaでJSONを使おうと思うと、別途、JSONライブラリが必要だ。いや、がんばって作るって手もあるが、ライブラリを使うのがいいだろう。けど、最新のJava8 SEでもなんでついてないんだ、こんなの。
って、書いてて思い出したが、.Net Framework(バージョンは覚えていない)にもついてなかったな。

ここでは、google-gsonを使う。

JSON文字列からJavaオブジェクトへの変換とJavaオブジェクトからJSON文字列への変換、それぞれリストになっている場合のサンプルを↓に示す。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package testgson;

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import java.util.List;

/**
 *
 * @author miyamoto
 */
public class TestGson {

    public static class User {
        @SerializedName("ID")   // 変数名とJSONでの項目名が違う場合に使う。
        public int id;
        public String fullname;
        
        public User(int id, String fullname) {
            this.id = id;
            this.fullname = fullname;
        }
        
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Gson gson = new Gson();
        
        // {"ID":123, "fullname":"ほげほげ"}をデシリアライズ
        User user = gson.fromJson("{ \"ID\":123, \"fullname\":\"ほげほげ\"}", User.class);
        System.out.printf("id:%d, fullname:%s\n", user.id, user.fullname);
        System.out.println("----");
        
        // userをシリアライズ
        String str1 = gson.toJson(user);
        System.out.println(str1);
        System.out.println("----");

        // リスト
        // [{"ID":123, "fullname":"ほげほげ"}, {"ID":124, "fullname":"ほげほげ2"}]をデシリアライズ
        List<User> users = gson.fromJson("[{\"ID\":123, \"fullname\":\"ほげほげ\"}, {\"ID\":124, \"fullname\":\"ほげほげ2\"}]",
                new TypeToken<List<User>>() {}.getType());
        users.stream().forEach((u) ->{
            System.out.printf("id:%d, fullname:%s\n", u.id, u.fullname);
        });
        System.out.println("----");

        // usersをシリアライズ
        String str2 = gson.toJson(users);
        System.out.println(str2);
        System.out.println("----");
    }
    
}

実行結果

id:123, fullname:ほげほげ
----
{"ID":123,"fullname":"ほげほげ"}
----
id:123, fullname:ほげほげ
id:124, fullname:ほげほげ2
----
[{"ID":123,"fullname":"ほげほげ"},{"ID":124,"fullname":"ほげほげ2"}]
----

このエントリーをはてなブックマークに追加

↑このページのトップヘ