Javaのgetter/setterの定義を自動で作成

#この記事について
Javaにおいて、クラスのフィールドに対して、getter/setterは関数名も含めて定型的に定義できる部分があると思ったので、手動で入力しないでいいようにPython3でスクリプトを書いてみましたので紹介します。
※IDEの機能などを使えばあるのかもしれませんが練習がてら書いてみました

なお、getter/setterとしては最低限の機能だけを考えます。例えば「setterで不正値のチェックを行いたい」といった場合には手動で追加となります。

#環境(ざっくり)
言語：Python3
OS：macOS (たぶん他のOSでも大丈夫だと思います)

#やりたいこと：Javaでのgetter/setterの定義
例を通してやりたいことを説明します。

下記のように、魔法使いを表すWizardクラスがあり、フィールドとして名前を表すnameや魔力を表すpower、更に、その魔法使いが闇の魔法使いであるかどうかを表すdarkがあったとします。

```java:Wizard.java
public class Wizard {
    private String name;
    private double power;
    private boolean dark;
    ...
}
```

※コード中の「...」は何か他の内容の記載を表しています

この場合に下記のようにgetter/setterを定義したいと思います。メソッド名はフィールド名nameに対してgetName/setNameという形にします。ただし、boolean型のフィールドについては、フィールド名darkに対しisDark/setDarkという形にします。

```java:Wizard.java
public class Wizard {
    private String name;
    private double power;
    private boolean dark;
    ...
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPower() {
        return this.power;
    }
    public void setPower(double power) {
        this.power = power;
    }
    public boolean isDark() {
        return this.dark;
    }
    public void setDark(boolean dark) {
        this.dark = dark;
    }
    ...
}
```

#スクリプトと実行例

###スクリプト
書いたスクリプトを以下に示します。

最初の3行ほどはファイルの場所に関することです。大まかな流れは、1行ずつフィールドを読み取って、型名と変数名からgetter/setterを記述するというものです。

```python:make_getter_and_setter.py
import os

path_of_this_script = os.path.dirname(__file__)
path_r = os.path.join(path_of_this_script, 'fields.txt')

with open(path_r) as f_r:
    for line in f_r: # line ex) "private String name;\n"
        line_list = line.rstrip().split(" ") # ex) ['private', 'String', 'name;']
        var_name = line_list[-1].rstrip(";") # ex) name
        pascal_var_name = var_name[0].upper() + var_name[1:] # ex) Name
        type_name = line_list[-2] # ex) String

        #getter
        #ex1)
        # public boolean isDark() {
        #     return this.dark;
        # }
        #ex2)
        # public String getName() {
        #     return this.name;
        # }
        if(type_name == "boolean"):
            getter_name = "is" + pascal_var_name # ex) isDark
        else:
            getter_name = "get" + pascal_var_name # ex) getName
        print("public " + type_name + " " + getter_name + "() {")
        print("    return this." + var_name + ";")
        print("}")

        #setter
        #ex)
        # public void setName(String name) {
        #     this.name = name;
        # }
        setter_name = "set" + pascal_var_name # ex) setName
        print("public void " + setter_name + "(" + type_name + " " + var_name + ") {")
        print("    this." + var_name + " = " + var_name + ";")
        print("}")
```

※なお、生成するJavaコードのインデントは「スペース4つ」としています。

###実行例
まず使い方ですが、上記スクリプトと同じフォルダにfields.txtというファイルを置き、下記のようにJavaコードからフィールドをコピペしておきます。

```:fields.txt
private String name;
private double power;
private boolean dark;
```

そして、スクリプトを実行すると、下記のようにgetter/setterの定義が出力されます。これを元のJavaコードにコピペして使ってください。実際に使う際は「setterは使わない」、「publicを消す」、「不正値の検査を追加する」など必要に応じて調整していただければ良いかと思います。

```bash:
$ python make_getter_and_setter.py 
public String getName() {
    return this.name;
}
public void setName(String name) {
    this.name = name;
}
public double getPower() {
    return this.power;
}
public void setPower(double power) {
    this.power = power;
}
public boolean isDark() {
    return this.dark;
}
public void setDark(boolean dark) {
    this.dark = dark;
}
```

#終わりに
遊びで作ったので実際使うかは分かりませんが、スクリプトを書くのは楽しかったです。ご意見・ご感想等ございましたらコメントしていただければと思います。

この記事のコードは目的等問わず自由に複製・改変などしていただいて構いません。