请参阅以下情况:
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绉!这是很多答案!非常感谢大家。
答案 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
中那样执行此操作。