所以假设我有
ArrayList<E> X = new ArrayList<E>();
我将X传递给某个参数:
Something Y = new Something(X);
它将通过引用而不是值传递X而且我不希望这个....类有一个具有Arraylist类型的字段应该是与自身不同的,我不想去迭代通过该死的arraylist并单独设置它只是为了实例化该领域......
是否有一种方法可以轻松地使Java通过值传递任何对象参数而不是引用,而无需在所有对象上实现可克隆接口,这是一个痛苦的屁股
答案 0 :(得分:4)
由于Java不允许直接指针操作,因此不能取消引用指针。你必须忍受参考。如果要防止传递的对象被修改,则必须克隆它或使其不可变(如String
)。另请注意object references are passed-by-value。因此,如果我们在C ++意义上采用 pass-by-reference ,那么诸如“Java具有传递引用”之类的语句并不准确。
答案 1 :(得分:1)
它实际上是按值传递X. (Something构造函数不能更改调用代码中的变量X。)X恰好是对ArrayList的引用,而不是ArrayList。你可以尝试:
Something Y = new Something(new ArrayList<E>(X));
答案 2 :(得分:1)
每次都可以传递不可修改的列表,而不是创建新对象。此列表是只读的,如果用户想要进行任何修改,用户必须创建另一个列表。
List unmodifiableList = Collections.unmodifiableList(list);
List newList = new ArrayList(unmodifiableList);
Collections.sort(newList);
ArrayList的构造函数接受现有列表,读取其元素(不修改它们!),并将它们添加到新列表中。