访问私有财产而不获取/设置

时间:2012-12-02 13:08:52

标签: java properties encapsulation private-members

  

可能重复:
  Absence of property syntax in Java

请参阅以下情况:

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

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

像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);
    }
}

我希望你们这里得到我的意思。

编辑:

Rolly绉!这是很多答案!非常感谢大家。

7 个答案:

答案 0 :(得分:17)

您可以>使用反射

来访问它们
Test test = new Test()
Field field = test.getClass().getDeclaredField("x");
field.setAccessible(true);

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

但是,不应该这样做

答案 1 :(得分:13)

你不能。

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

我没有看到使用着名的吸气剂和制定者的任何问题。

答案 2 :(得分: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();
    }
}

到目前为止,我认为我们没有这样的手段,但我也没有看到使用getter和setter没什么不对。

答案 3 :(得分:4)

最多可以使用private切换protected,以便继承它可以直接访问它。

但是,你真的不能。此属性与方法关联。它必须在Java中运用括号()。在Java中没有“像现在这样”这样做,它必须是某种方法的指针。

答案 4 :(得分:3)

拥有一个getter和setter已经打破了精神上的封装,所以不要犹豫使用公共领域。争论的焦点是“当你想要在你的制定者中进行验证的时候,你会感谢你自己做出有远见的决定”,这听起来似乎有道理,但在实践中它只是一个孩子的故事。我在职业生涯中写过数千名二人从来没有一个必须添加验证。如果有验证,它总是在外面发生。这将验证与数据分离,并为每个用例提供不同的规则。

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

答案 5 :(得分:2)

考虑将来你将不允许为将要使用你的变量x的x用户输入减去值。在这种情况下,您必须在验证时更改setX,并且已经使用过该方法的人不会受到影响,这是封装。所以高度重新设计你在使用私人声明时使用公共getter和setter。

答案 6 :(得分: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中那样执行此操作。