我试图创建一个在其外部类的构造函数中使用的类的实例。参考下面的代码,我需要一个UserData
对象,但我也需要一个TimeOnlineInfo
对象来创建它,我不认为没有UserData
的实例就可以获得TimeOnlineInfo
对象,因为TimeOnlineInfo
不是静态的。我不能使它静态,因为它需要从它的外部类访问一个方法。有什么方法可以让它起作用或者达到最相似的效果吗?我确实意识到,我可以只是使类静态,而不是直接在addTime方法中保存数据,但我已经通过这个问题的一半,我很好奇,看看是否有这样做的方法。
下面是我的代码的一个非常简化的版本:
class UserData {
TimeOnlineInfo timeOnline;
public UserData(Object data1, Object data2, Object data3, Object data4, Object data5, TimeOnlineInfo timeOnlineInfo){
this.timeOnlineInfo = timeOnlineInfo;
}
public class TimeOnlineInfo {
private int time;
public TimeOnlineInfo(int time){
this.time = time;
}
public void addTime(int time){
this.time += time;
UserData.this.saveData();
}
}
}
UserData userData = new UserData(new UserData.TimeOnlineInfo());//Doesn't work because PlayInfo is not a static class
UserData userData = new UserData(userData.new TimeOnlineInfo());//This is just a stupid because i'm using the uncreated object in its own constructor
您对一些事情有一些普遍的困惑。让我们从头开始。
首先,这不是构造函数。
public void UserData(TimeOnlineInfo timeOnlineInfo){
this.timeOnlineInfo = timeOnlineInfo;
}
你的意思是放弃void
声明。
public UserData(TimeOnlineInfo timeOnlineInfo){
this.timeOnlineInfo = timeOnlineInfo;
}
第二,用内部类的实例实例化外部类在结构上没有意义,因为获得内部类的实例的唯一方法是从外部类开始。
例如,您必须为TimeOnlineInfo
的实例使用new UserData().new TimeOnlineInfo(int)
,但这只是:
- 如果您选择为
UserData
创建一个无参数构造函数 - 如果你真的不关心
UserData
的实例你会返回
如果你真的想要保持这种设计,那么考虑传递一个int给你的构造函数,这样它就可以提供给TimeOnlineInfo
的实例。
class UserData {
TimeOnlineInfo timeOnlineInfo;
public void saveData() {
// stub
}
public UserData(int value) {
this.timeOnlineInfo = new TimeOnlineInfo(value);
}
public class TimeOnlineInfo {
private int time;
public TimeOnlineInfo(int time){
this.time = time;
}
public void addTime(int time){
this.time += time;
UserData.this.saveData();
}
}
}
首先,您的UserData
构造函数不是一个。
您已经将其声明为void
方法,因此没有UserData
构造函数可以编译,并使用TimeOnlineInfo
实例参数化。
但这可能只是一个打字错误。
然后,如果您可以在现有构造函数的基础上为UserData
实现无参数构造函数,则可以使用以下习惯用法:
UserData ud = new UserData(new UserData().new TimeOnlineInfo(42));
然而,这似乎表明一个更普遍的问题在你的设计,因为你基本上必须初始化UserData
两次获得一个可用的实例。
这里的想法是,您要么在构造函数中注入TimeOnlineInfo
,在这种情况下,TimeOnlineInfo
可能被比UserData
更广泛的范围使用,或者您只在UserData
中使用TimeOnlineInfo
,在这种情况下,为UserData
使用空构造函数并在其中初始化您的内部TimeOnlineInfo
。
你可以这样修改你的构造函数:
public void UserData(int time){
this.timeOnlineInfo = new TimeOnlineInfo(time);
}
您也可以将TimeOnlineInfo
的构造函数设为私有,以阻止其他人实例化非法的TimeOnlineInfo
实例。
但是根据你发布的片段,我可能会完全摆脱TimeOnlineInfo
。
有人警告过我,我认为是构造函数的东西不是构造函数。首先,永远不要创建与类同名的常规方法。
其余部分仍然存在,这种安排的问题是任何人都可以创建一个TimeOnlineInfo
对象,即使它没有被创建它的UserData
引用,它也会触发UserData.this.saveData()
。
:
- 将
TimeOnlineInfo
实例化作为UserData
的作业。 - 去掉
TimeOnlineInfo
。(如果您的类已经很大,则不可行,但如果您的类已经很大,则可能还需要做其他事情。) 将内部类设置为静态并显式管理连接:
public void setTimeOnlineInfo(TimeOnlineInfo timeOnlineInfo){ if (timeOnlineInfo.userData != null) { throw new IllegalArgumentException( "TOI already belongs to other UserData" ); } if (this.timeOnlineInfo != null) { this.timeOnlineInfo.userData = null; } timeOnlineInfo.userData = this; this.timeOnlineInfo = timeOnlineInfo;
}
公共静态类TimeOnlineInfo {Private int time;private UserData UserData;
public TimeOnlineInfo(int time){ this.time = time; } public void addTime(int time){ this.time += time; userData.saveData(); }
}
远非理想,但它也可以解决其他几个问题。