如何从其他对象访问类私有列表?以TwitterAccount类为例
问题解答
嘿,我来帮你理清这两个问题,尤其是面向对象封装下的成员访问逻辑~
1. 如何从另一个对象访问列表?
这得看列表所在类的封装设计:
- 如果列表是**公共(public)**成员(不推荐这种设计),可以直接通过
另一个对象.列表变量名访问,但这种做法会破坏封装,外部能随意修改内部数据,容易出问题。 - 如果列表是私有(private)成员(正确的封装方式),必须通过该类提供的公共方法来访问或操作——要么是获取列表的只读视图(getter),要么是专门的修改方法(比如添加、删除元素的方法)。
2. TwitterAccount类变量私有后,follow方法里怎么访问otherAccount的followers列表?
因为followers是私有成员,你不能直接写otherAccount.followers.add(this),得用符合封装原则的方式处理,推荐两种方案:
方案一:添加专门的粉丝管理方法(最推荐)
最好的做法是在TwitterAccount里写一个addFollower方法,专门用来添加粉丝,然后在follow方法里调用这个方法。这样你还能在方法里加校验逻辑(比如避免重复关注、禁止自关注):
public class TwitterAccount { private String name; private List<TwitterAccount> follows; private List<TwitterAccount> followers; private Collection<Tweet> tweetCollections; public TwitterAccount(String name) { this.name = name; follows = new ArrayList<>(); followers = new ArrayList<>(); } // 关注方法:处理自己的关注列表,同时通知对方添加自己为粉丝 public void follow(TwitterAccount otherAccount) { // 先校验:不能关注自己,也不能重复关注 if (otherAccount == this || follows.contains(otherAccount)) { return; } follows.add(otherAccount); // 调用对方的addFollower方法,完成粉丝关联 otherAccount.addFollower(this); } // 专门的添加粉丝方法,封装粉丝列表的修改逻辑 public void addFollower(TwitterAccount newFollower) { if (!followers.contains(newFollower)) { followers.add(newFollower); } } // 如果需要对外暴露粉丝列表,返回只读视图,防止外部修改内部数据 public List<TwitterAccount> getFollowers() { return Collections.unmodifiableList(followers); } // 同理,返回关注列表的只读视图 public List<TwitterAccount> getFollows() { return Collections.unmodifiableList(follows); } // 获取用户名的getter public String getName() { return name; } }
方案二:提供只读的getter(仅当需要查看列表时用)
如果你只是需要读取followers列表的内容,不需要修改,可以写一个返回不可修改列表的getter,比如上面代码里的getFollowers()——用Collections.unmodifiableList()包装后,外部只能读取列表,不能添加/删除元素,保证内部数据的安全性。
为什么不直接返回followers?因为如果返回原列表的引用,外部代码可以直接修改你的私有列表,破坏封装性,比如otherAccount.getFollowers().clear()会清空对方的粉丝列表,这显然不符合设计预期。
内容的提问来源于stack exchange,提问作者Henrik
相关产品推荐
相关产品推荐

