Java Don';返回对象的getter是否允许调用者直接访问成员变量?
假设我有一个简单的类,它将用户的好友存储在字符串的ArrayList中,并使用getter访问该ArrayList:Java Don';返回对象的getter是否允许调用者直接访问成员变量?,java,oop,Java,Oop,假设我有一个简单的类,它将用户的好友存储在字符串的ArrayList中,并使用getter访问该ArrayList: public class User { private ArrayList<String> mFriends; // ...other code like constructors and setters... public ArrayList<String> getFriends() { return mFriends;
public class User
{
private ArrayList<String> mFriends;
// ...other code like constructors and setters...
public ArrayList<String> getFriends()
{
return mFriends;
}
}
公共类用户
{
私人ArrayList mFriends;
//…其他代码,如构造函数和setter。。。
公共ArrayList getFriends()
{
回报朋友;
}
}
由于Java和许多其他语言(等价地)通过引用传递,这不允许getFriends()的调用者直接访问我的字符串数组列表,也就是说,他们甚至不需要调用我的setter就可以修改它吗
我觉得这极大地打破了封装的概念。除了动态创建一个具有相同值的新ArrayList并返回该值之外,是否还有正常的解决方法,或者我是否误解了什么
编辑:我知道Java不是真正的按引用传递,而是传递原始对象地址的副本,但这与向类外的对象公开对象时按引用传递具有相同的效果如果您担心封装,则可以返回列表的副本,例如
public ArrayList<String> getFriends() {
return new ArrayList<>(mFriends);
}
public ArrayList getFriends(){
返回新的ArrayList(mFriends);
}
顺便说一句,Java并不是真正的按引用传递,它更多的是按值传递。如果您担心封装,那么您可以返回列表的副本,例如
public ArrayList<String> getFriends() {
return new ArrayList<>(mFriends);
}
public ArrayList getFriends(){
返回新的ArrayList(mFriends);
}
顺便说一下,Java并不是真正的按引用传递,而是按值传递
.clone()
)李>
newarraylist(yourObjectHere)
)李>
举个例子:如果您想更改对象的状态,而不只是通过其setter设置一个新对象,该怎么办?如果您想修改现有的朋友(在您的示例中),该怎么办?您认为创建一个新的朋友列表并将其设置到对象中更好吗?不,在后一种情况下,您只是失去了对对象的控制
.clone()
)李>
newarraylist(yourObjectHere)
)李>
举个例子:如果您想更改对象的状态,而不只是通过其setter设置一个新对象,该怎么办?如果您想修改现有的朋友(在您的示例中),该怎么办?您认为创建一个新的朋友列表并将其设置到对象中更好吗?不,在后一种情况下,您只是失去了对对象的控制
对于易变对象,您是正确的。你可以用这样的东西把这块地包起来。我们还看到,for(可变)集合没有getter,但是
addFriend
,getFriend(index)
等等
事实上,getter(特别是setter)已不再是一种备受推崇的模式
成员“m”前缀更适合于其他语言。您适合可变对象。你可以用这样的东西把这块地包起来。我们还看到,for(可变)集合没有getter,但是
addFriend
,getFriend(index)
等等
事实上,getter(特别是setter)已不再是一种备受推崇的模式
成员“m”前缀更适合于其他语言。这里您要防止的是外部代码修改,
ArrayList
mFriends
引用的。但是正如您所注意到的,外部代码仍然可以修改该列表的内容。如果您想避免这种情况,您可以使用Collections.unmodifiableList
,或者返回一份副本。是的,这正是我的意思。对于将非内置的“标准”Java对象传回,这将如何工作?例如,我应该信任用户在不使用setter的情况下不修改其内容吗?如果他们不修改内容很重要,那么