[英]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.