【发布时间】:2018-01-04 15:54:44
【问题描述】:
我搜索了很多关于我的问题的答案并找到了几个选项,想知道你这是最佳做法。
用例:
所以我有一个单例类AccontManager,它有一个只与它相关的内部类,它是一个User 类。
public class AccontManager {
private static final AccountManger ourInstance = new AccountManger();
private User user;
public static AccountManger getInstance()
{
return ourInstance;
}
private AccountManger(){}
public User getUser(){
return this.user;
}
private class User{
private String id;
private User (String id){
this.id = id;
}
}
}
现在的情况是User字段必须访问外部包类,但用户类只对这个单例类是唯一的,因此内部类必须是私有的。
最好在内部类中创建公共 getter 方法来获取用户字段,但由于内部类是私有的,所以这是不可能的。
可能的做法:
-
实践:在
User字段的外部AccountManager类中创建相应的getter 方法。缺点:用户字段与
User相关,因此外部类不应对其字段具有getter 方法。代码示例:
public class AccountManger { private static final AccountManger ourInstance = new AccountManger(); private User user; public static AccountManger getInstance() { return ourInstance; } private AccountManger(){} public User getUser(){ return this.user; } public String getUserId() // <-- get User id { return user.id; } private class User{ private String id; private User (String id){ this.id = id; } } } -
实践:将
User修饰符更改为public,但保持构造函数私有,因此无法实例化。缺点:内部的
User类将作为AccountManager单例类的成员可见,这是不应该的。代码示例:
public class AccountManager { private static final AccountManger ourInstance = new AccountManager(); private User user; public static AccountManager getInstance() { return ourInstance; } private AccountManger(){} public User getUser(){ return this.user; } public String getUserId() // <-- get User id { return user.id; } private class User{ private String id; private User (String id){ this.id = id; } } } -
练习:
- 创建一个公共接口,例如
IUser - 使内部类
User实现该接口 - 添加到外部类,在这种情况下
AccountManager是User实例的getter 方法
缺点:需要使用接口才能从User获取数据。
代码示例:
public class AccountManager {
private static final AccountManager ourInstance = new AccountManager();
private User user;
public interface IUser{
String getName();
}
private AccountManager(){}
public static AccountManager getInstance(){
return ourInstance;
}
public User getUser(){
return this.user;
}
private class User implements IUser{
private String id;
private User(String id){
this.id = id;
}
@Override
public String getName() { // <-- get user id
return id;
}
}
}
所以你怎么看? 列出的任何一个选项? 还有什么办法?
感谢您的意见
【问题讨论】:
标签: java inner-classes