繁体   English   中英

使用公共方法更改Java中的私有字段

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM