1. ホーム
  2. java

[解決済み】Javaで構造体のようなオブジェクトを作成する

2022-04-15 18:56:47

質問

構造体のようなオブジェクトを作成することは、Javaのやり方に完全に反しているのでしょうか?

class SomeData1 {
    public int x;
    public int y;
}

アクセッサとミューテータを持つクラスは、よりJavaらしいと言えますね。

class SomeData2 {
    int getX();
    void setX(int x);

    int getY();
    void setY(int y);

    private int x;
    private int y;
}

最初の例のクラスは、記法的に便利です。

// a function in a class
public int f(SomeData1 d) {
    return (3 * d.x) / d.y;
}

これでは不便です。

// a function in a class
public int f(SomeData2 d) {
    return (3 * d.getX()) / d.getY();
}

解決方法は?

これはよく議論されるトピックです。オブジェクトにパブリックフィールドを作成することの欠点は、そこに設定される値を制御できないことです。多くのプログラマーが同じコードを使用するグループプロジェクトでは、副作用を避けることが重要です。さらに、フィールドのオブジェクトのコピーを返したり、何らかの方法で変換したりした方が良い場合もあります。そのようなメソッドは、テストの中でモック化することができます。新しいクラスを作成する場合、すべての可能なアクションを見ることはできないかもしれません。これは防御的なプログラミングのようなもので、ゲッターやセッターはいつか役に立つかもしれませんし、それらを作成したり使用したりするのに多くのコストはかかりません。だから、時には役に立つのです。

実際には、ほとんどのフィールドは単純なゲッターとセッターを持っています。可能な解決策は次のようなものです。

public property String foo;   
a->Foo = b->Foo;

更新:Java 7でプロパティのサポートが追加される可能性は極めて低く、おそらく今後も追加されないでしょう。 Groovy、Scalaなどの他のJVM言語は、現在この機能をサポートしている。- Alex Miller