Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过返回如何启用访问控制?(爪哇)_Java - Fatal编程技术网

Java 通过返回如何启用访问控制?(爪哇)

Java 通过返回如何启用访问控制?(爪哇),java,Java,在Java中,当您为类的私有字段生成getter时,如下所示(假设child是ArrayList): 你返回一个引用到私有字段“名称”(这意味着在C++中可以使用该引用修改ARARYLIST),这一种代码会返回一个拷贝,如果该拷贝被操作,它会使对象的字段不受伤害。 可以通过调用此方法然后修改返回的ArrayList引用来修改私有成员吗?如果是的话,那么像Java这样的语言中的getter是如何控制访问的呢?写一个getter来保护私有成员的正确方法是什么 返回对私有字段“name”的引用 嗯,不

在Java中,当您为类的私有字段生成getter时,如下所示(假设child是ArrayList):

<>你返回一个引用到私有字段“名称”(这意味着在C++中可以使用该引用修改ARARYLIST),这一种代码会返回一个拷贝,如果该拷贝被操作,它会使对象的字段不受伤害。 可以通过调用此方法然后修改返回的ArrayList引用来修改私有成员吗?如果是的话,那么像Java这样的语言中的getter是如何控制访问的呢?写一个getter来保护私有成员的正确方法是什么

返回对私有字段“name”的引用


嗯,不完全是。返回
子字段的当前值。重要的是要理解,这与以某种方式返回对字段本身的引用不同。方法返回后,方法调用方将看不到对字段的任何更改(例如,将其设置为null,或使其引用其他列表)。区分字段、引用(字段的值)和引用引用的对象很重要

那么,像Java这样的语言中的getter是如何控制访问的呢

没有,直接的

编写返回副本的getter的正确方法是什么

这取决于类型。如果使用不可变类型,则无需复制:)

对于集合,您可能会在原始集合上创建只读视图,但调用方仍将看到对原始集合的更改。或者您可以直接创建自己的副本,例如

return new ArrayList<>(child);
返回新的ArrayList(子级);
返回对私有字段“name”的引用


嗯,不完全是。返回
子字段的当前值。重要的是要理解,这与以某种方式返回对字段本身的引用不同。方法返回后,方法调用方将看不到对字段的任何更改(例如,将其设置为null,或使其引用其他列表)。区分字段、引用(字段的值)和引用引用的对象很重要

那么,像Java这样的语言中的getter是如何控制访问的呢

没有,直接的

编写返回副本的getter的正确方法是什么

这取决于类型。如果使用不可变类型,则无需复制:)

对于集合,您可能会在原始集合上创建只读视图,但调用方仍将看到对原始集合的更改。或者您可以直接创建自己的副本,例如

return new ArrayList<>(child);
返回新的ArrayList(子级);

如果你真的想保护你的对象,那就让你的对象不可变


如果你真的想保护你的对象,那就让你的对象不可变


编写保护私有成员的getter的正确方法是什么?
取决于您对
保护的定义。如果它是“不让任何人访问”,那么你就不会提供一个getter。如果是,请不要让调用者更改它,然后使getter返回的对象不可变。您可能需要使用一个更现实的示例,顺便说一句,
ArrayList
不是有效的Java。
编写保护私有成员的getter的正确方法是什么?
取决于您对
protect
的定义。如果它是“不让任何人访问”,那么你就不会提供一个getter。如果不允许调用者更改它,则使getter返回的对象不可变。您可能需要使用更现实的示例,顺便说一句,ArrayList
不是有效的Java。“在方法返回后,对字段的任何更改(例如,将其设置为null,或使其引用其他列表)都不会被方法调用者看到。”但是调用者所做的任何更改都将被对象看到?@user3427072:对对象所做的更改将被看到-但是调用者所做的任何操作都不会改变字段的值。它仍将引用与以前相同的对象。。。即使该对象的内容已更改。(重要的是要理解字段的值不是对象,它只是一个引用。)在将参数传递给函数的上下文中,我已经阅读了一些关于Java中按值传递与按引用传递的其他问题。我理解Java在这种情况下是如何通过值传递的。相同的原则在这里发挥作用吗?@user3427072:是的,完全正确。“在方法返回后,对字段的任何更改(例如,将其设置为null,或使其引用其他列表)将不会被方法调用方看到。”但是调用者所做的任何更改都将被对象看到?@user3427072:对对象所做的更改将被看到-但是调用者所做的任何操作都不会改变字段的值。它仍将引用与以前相同的对象。。。即使该对象的内容已更改。(重要的是要理解字段的值不是对象,它只是一个引用。)在将参数传递给函数的上下文中,我已经阅读了一些关于Java中按值传递与按引用传递的其他问题。我理解Java在这种情况下是如何通过值传递的。这里也有同样的原则吗?@user3427072:是的,没错。