6

可能重复:
Java 中没有属性语法

请看以下情况:

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

如您所见,没有什么特别的。但是,我想知道是否有可能以使用该类的人不需要使用 getX() 的方式保留“私有 x”,换句话说,如果我可以映射一些自动调用的变量获取和设置。

类似于 Delphi 中的“属性”。它可以避免在复杂表达式中使用 setX() 和 getX() ,并且可以更容易理解谁在读取表达式。

例如,假设可以使用另一个标识符 xx 和 yy 来代替 get 和 set 方法。看:

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

你不能。

这就是我们在“封装”中谈论的原因。仅当您将私有更改或修改为其他内容或使用反射(会使它变得更加复杂)时。

我认为使用著名的 getter 和 setter 没有任何问题。

于 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

最多您可以切换privatewithprotected以便任何继承它都可以直接访问它。

但是,是的,你真的不能。此属性与方法相关联。它必须在 Java 中使用括号 ()。在 Java 中还没有办法做到这一点,它必须是某种指向方法的指针。

于 2012-12-02T13:22:23.990 回答
3

拥有 getter 和 setter 已经在精神上打破了封装,所以不要犹豫使用公共领域。“总有一天你会想要在你的 setter 中得到验证,你会感谢自己做出有远见的决定来拥有它们”这个论点表面上看起来似乎是合理的,但实际上这只是一个孩子的故事。在我的职业生涯中,我写了几千个二传手;以后再也不需要添加验证。如果有验证,它总是在外面发生。这将验证与数据分离,并为每个用例允许不同的规则。

另一个想法是保留方法,但使名称真正简短:int x()void x(int x).

于 2012-12-02T13:31:14.527 回答
2

想想将来您将不允许为将使用您的变量 x 的 x 用户输入负值。在这种情况下,您必须通过验证更改 setX,并且已经使用该方法的人不会受到影响,这就是封装。因此,强烈建议您在进行私有声明时使用公共 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 回答