[英]Changing private fields in Java using public methods
在C ++中,有一种更改数据的方法,即使它是私有的:
class Foo
{
private:
char * i;
public:
char * getInt() {return i;};
Foo() {i="Winter";};
}
int main()
{
Foo a;
strcpy(a.getInt(), "Summer"); //it changes i
cout<<a.getInt(); //gives "Summer"
return 0;
}
用Java有什么办法做到这一点?
编辑:如果有,那么在C ++中是否有像const
这样的关键字来防止这种行为?
Java返回指向对象的指针的副本(以及基元值的副本)。 String
就是这样的对象。 例如
class Foo {
private String i = "Winter";
public String get() { return i; }
}
现在这是绝对安全的,没有任何东西(反射除外)可以更改您的私有字段或状态:
void main() {
Foo a = new Foo();
String i = a.get();
String j = i + " rocks"; // creates a new string
i = "Summer"; // now points to another string
System.out.println(a.get()); // still prints "Winter"
}
但是,如果代码能够修改返回的对象,则不能阻止它对其进行更改。
Java也没有内置方法来使对象不可变,您必须将它们设计为有效不可变的,例如String
类。 每个“修改”字符串的方法实际上都会创建一个新的不可变字符串,该字符串可以在所有场所和线程之间共享,而无需担心。
如果你的课是
class Foo {
public String i = "Winter";
}
你不会很安全。 代码可以更改该字段指向的内容。
void main() {
Foo a = new Foo();
a.i = "Summer"; // that works.
System.out.println(a.i); // prints "Summer"
}
尽管您不应该拥有公共字段,尤其是如果您不希望对其进行修改,但是有一些有用的东西: final
。
class Foo {
public final String i = "Winter";
}
void main() {
Foo a = new Foo();
a.i = "Summer"; // Error: final field cannot be modified.
}
final
关键字保证一个字段只被分配一次。 构造函数完成后,该字段需要具有一个值,此后不能更改。 但是,引用的对象可能仍然是可变的,只是对其的引用不是可变的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.