Java はPass by Value、より具体的にはPass a Reference by Valueです。これは、すべての参照型が次のように渡されることを意味します。
List<String> a = myObj.getList();
a.add("My String"); // this modifies the source list
List<String> b = new ArrayList<String>();
a = b; // this doesn't change the source list's reference
Java でプログラミングする場合、ほとんどの人は可能な限り最高レベルのカプセル化を試み、可変型を不変型に変換します (たとえば、コピー コンストラクターのイディオムを使用します)。これは、OOP 空間でプログラミングする良い方法です。
セッターがない場合は、Java の組み込みリフレクションを使用することをお勧めします。
public class Test {
private String NAME = "OLD NAME";
public String getName() {
return this.NAME;
}
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Test t = new Test();
System.out.println(t.getName()); // OLD NAME
Field f = t.getClass().getDeclaredField("NAME");
f.setAccessible(true); // allows access to private field
f.set(t, "NEW NAME");
System.out.println(t.getName()); // NEW NAME
}
}
ただし、リフレクションは高度なトピックであり、ほとんどの場合、不適切なプログラミングの兆候であることに注意してください。