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

Create Instance of a Class that is Used in the Constructor of its Outer Class

我正在尝试创建一个 class 的实例,用于其外部 class 的构造函数。参考下面的代码,我需要一个 UserData 对象,但我还需要一个 TimeOnlineInfo 对象来创建它,而且我没有看到没有先获得 TimeOnlineInfo 对象的方法UserData 的实例,因为 TimeOnlineInfo 不是静态的。我不能让它成为静态的,因为它需要从它的外部 class 访问一个方法。无论如何我可以让它工作或获得最相似的效果吗?我确实意识到我可以将 classes 设为静态而不是直接在 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(int time){
    this.timeOnlineInfo = new TimeOnlineInfo(time);
}

您还可以将 TimeOnlineInfo 的构造函数设为私有,以阻止其他人实例化流氓 TimeOnlineInfo 实例。

但根据您发布的片段,我可能会完全摆脱 TimeOnlineInfo


有人警告我,我认为是构造函数的东西不是构造函数。所以首先,永远不要创建与 class 同名的常规方法。

剩下的仍然成立,这种安排的问题是任何人都可以创建一个 TimeOnlineInfo 对象,即使它没有被 [=18= 引用,它也会触发 UserData.this.saveData() ] 它是用

创建的

所以要么:

  1. 使 TimeOnlineInfo 实例化成为 UserData 的工作。
  2. 干掉TimeOnlineInfo。 (如果你的 class 已经很大,那是不可行的,但是如果你的 class 有那么大,你可能还需要做其他事情。)
  3. 使您的内部 class 静态并显式管理连接:

    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;
    

    }

    public 静态 class TimeOnlineInfo { 私人时间; 私人用户数据用户数据;

     public TimeOnlineInfo(int time){
        this.time = time;
     }
    
     public void addTime(int time){
         this.time += time;
         userData.saveData();
     }
    

    }

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

首先,您的 UserData 构造函数不是一个。

您已将其声明为 void 方法,因此没有 UserData 构造函数可以编译,并使用 TimeOnlineInfo 实例进行参数化。

但这可能只是一个错字。

然后,如果您可以在现有构造函数之上为 UserData 实现无参数构造函数,则可以使用以下习惯用法:

UserData ud = new UserData(new UserData().new TimeOnlineInfo(42));

但是,这似乎表明您的设计存在更普遍的问题,因为您基本上必须初始化 UserData 两次才能获得可用的实例。

这里的想法是,你要么在构造函数中注入 TimeOnlineInfo,在这种情况下 TimeOnlineInfo 可能会被比 UserData 更广泛的范围使用,或者你只使用TimeOnlineInfoUserData 中,在这种情况下,为 UserData 使用空构造函数并在其中初始化内部 TimeOnlineInfo

您对一些事情有一些普遍的困惑。让我们从头说起。

首先,这不是构造函数。

public void UserData(TimeOnlineInfo timeOnlineInfo){
    this.timeOnlineInfo = timeOnlineInfo;
}

您打算删除 void 声明。

public UserData(TimeOnlineInfo timeOnlineInfo){
    this.timeOnlineInfo = timeOnlineInfo;
}

其次,用内部 class 的实例实例化外部 class 在结构上没有意义,因为获取实例 of[ 的唯一方法=36=]里面的class是用外面的class开头的

例如,对于 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();
        }
    }
}