6

重複の可能性:
Javaにプロパティ構文がない

次の状況を参照してください。

class Test extends Object {
    private int x;
    public getX() {return x;}
    public setX(int _x) {x = _x;}
}

ご覧のとおり、特別なことは何もありません。ただし、クラスを使用している人がgetX()を使用する必要がないように、その「プライベートx」を維持できるかどうか、つまり、自動的に呼び出される変数をマップできるかどうかを知りたいです。取得して設定します。

Delphiの「プロパティ」のようなもの。複雑な式でsetX()とgetX()を使用する必要がなくなり、誰が式を読み取るかを理解しやすくなります。

たとえば、getメソッドとsetメソッドの代わりに別の識別子xxとyyを使用できるとします。見る:

import Test;
public static void main(String[] args) {
    new Test() {
        setX(10);
        setY(20);
        int z = getX() * getY() + (getY() * getY());
        System.out.println("%d", z);
    }
    // would be like this
    new Test() {
        xx = 10;
        yy = 20;
        int z = xx * yy + (yy * yy); // xx would access the method getX() automatically
        System.out.println("%d", z);
    }
}

私がここで意味することを皆さんが理解したことを願っています。

編集:

とろけるクレープ!それはたくさんの答えです!みなさん、どうもありがとうございました。

4

7 に答える 7

18

リフレクションを使用してアクセスできます

Test test = new Test()
Field field = test.getClass().getDeclaredField("x");
field.setAccessible(true);

System.out.println(field.getName() + "="+field.get(test ));

しかし、あなたはこれをすべきではありません

于 2012-12-02T13:32:27.933 に答える
13

You can't.

That's why we talk in "encapsulation". Only if you change or modify from private to something else or if you use reflection (what would make it even more complicated).

I don't see any problem in using the famous getters and setters.

于 2012-12-02T13:12:08.383 に答える
6

次のコードのように、C# のプロパティのように理想化しようとしていると思いますよね?:

public sealed class Example {
    private int _code;
    private string _name;

    public Example(int code) {
        this._code = code;
    }

    public int Code {
        get {return this._code;}
        set {this._code = value;}
    }

    public string Name {
        set {this._name = value;}
        get {return this._name;}
    }

    public override string ToString() {
        return this._code.ToString();
    }
}

Java ではこれまでのところ、そのような手段はないと思いますが、getter と setter を使用することに何の問題もないと思います。

于 2012-12-02T13:34:48.363 に答える
4

At most you can switch the private with protected so whatever inherit it can access it directly.

But yeah, you really can't. This property is associated to the method. It has to sport the parentheses () in Java. There's no way "yet" to do it like this in Java, it'd have to be some kind of pointer to a method.

于 2012-12-02T13:22:23.990 に答える
3

getter と setter を使用すると、カプセル化が精神的に破られるため、パブリック フィールドを使用することを躊躇しないでください。「セッターで検証が必要になる日が来るでしょう。検証を行うという先見の明のある決定に感謝するでしょう」という議論は、一見もっともらしく聞こえますが、実際には単なる子供の話です。私はキャリアの中で数千のセッターを書いてきました。後で検証を追加する必要はありませんでした。検証があった場合、それは常に外側で起こっていました。これにより、検証がデータから分離され、ユースケースごとに異なるルールが許可されます。

もう 1 つのアイデアは、メソッドをそのままにして、名前を短くすることです:int x()void x(int x).

于 2012-12-02T13:31:14.527 に答える
2

将来的には、変数 x を使用する x ユーザーにマイナス値を入力することは許可されなくなると考えてください。その場合、検証で setX を変更する必要があり、そのメソッドを既に使用している人はカプセル化の影響を受けません。したがって、private 宣言を行いながら public getter と setter を使用することを強くお勧めします。

于 2012-12-02T13:22:54.250 に答える
0

私はそれらを説明しようとします........

class Test extends Object

まず、を使用する必要はありませんTest extends Object。いつでもdon't or do explicitly extends your class to any other class, it will always extend the Object Class, directly or indirectly.

-さて、あなたの質問にお答えします。ここに表示されているものはEncapsulation、最も単純で最も基本的な形式で呼ばれています。ではJava、 で行うようにはできませんDelphi or .Net

于 2012-12-02T13:32:19.597 に答える