创建在其外部类的构造函数中使用的类的实例



我试图创建一个在其外部类的构造函数中使用的类的实例。参考下面的代码,我需要一个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()

:

  1. TimeOnlineInfo实例化作为UserData的作业。
  2. 去掉TimeOnlineInfo。(如果您的类已经很大,则不可行,但如果您的类已经很大,则可能还需要做其他事情。)
  3. 将内部类设置为静态并显式管理连接:

    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();
     }
    

    }

远非理想,但它也可以解决其他几个问题。

相关内容

  • 没有找到相关文章

最新更新