Java 使用父对象创建子对象的字段实例

Java 使用父对象创建子对象的字段实例,java,Java,我有一个用户(家长)和一个任务(孩子)。我需要在每个任务中有一个用户实例,并希望该任务在用户中可用 版本1和版本2有什么不同吗 我应该选择哪个版本 第1版: public class User { // does this creates a new Task on each field access? private Task task = new Task(this); public void runTask() { task.run(); } } public class U

我有一个
用户
(家长)和一个
任务
(孩子)。我需要在每个任务中有一个用户实例,并希望该任务在用户中可用

版本1和版本2有什么不同吗

我应该选择哪个版本

第1版:

public class User {

// does this creates a new Task on each field access?
private Task task = new Task(this);

public void runTask() {
   task.run();
}

}
public class User {

private Task task;

public getTask() {
   if(task == null) {
    task = new Task(this);
   }
   return task;
}

public void runTask() {
   task.run();
}
}
第2版:

public class User {

// does this creates a new Task on each field access?
private Task task = new Task(this);

public void runTask() {
   task.run();
}

}
public class User {

private Task task;

public getTask() {
   if(task == null) {
    task = new Task(this);
   }
   return task;
}

public void runTask() {
   task.run();
}
}
我想,第一个版本进行了一次快速初始化,与此相同:

第3版

public class User {
    public User(){
       // I need the user instance to put into the task, but this is null here..
       this.task = new Task(this);
    } 
    private Task task;

}
我想要实现的是:


我在
User.java
中有很多方法,希望将这些方法外包给一个新类
Task.java
(与其用户相关)

版本2可能会导致
NullPointerException
,因为您必须始终在
runTask()
之前调用
getTask()
,否则将引发
NullPointerException

您可以在运行
任务之前创建
实例

公共类用户{
私人任务;
public void runTask(){
如果(任务==null){
任务=新任务(此任务);
}
task.run();
}
}

编辑:由于您的评论澄清了一些问题,以下是您可能应该采取的方法:


公共类用户{
私人任务;
公共用户()
{
}
public void runTask()
{
如果(任务==null)
{
任务=新任务();
}
task.run();
}
}
公共类任务扩展用户{
公共任务()
{
}    
}
像这样,任务将从用户继承所有方法和属性。我不完全确定这会对User的构造函数产生什么影响,这取决于类的其余部分到底是什么样子。现在,您可以使用与User相同的构造函数调用Task,还可以在Task中使用User构造函数的参数和其他参数(如果需要)定义自己的构造函数

 public class User {

// does this creates a new Task on each field access?
private Task task = new Task(this);
回答这里的问题:每次创建一个新用户对象时,该新用户的任务字段都将被初始化。只有那时。一旦如果您想确保它不会被重新分配,那么最好执行以下操作:

private final Task task = new Task(this);

但这里真正的问题是不同的:您在这里创建了一个非常奇怪的依赖关系。您已经说过您的用户类有太多的字段,现在您为它添加了另一项职责,即运行“任务”

因此,这里真正的答案是:退后一步


找一些更有经验的人和你坐下来。向他们解释您的需求,并让他们审查您的设计和代码库。这里没有一个“做这个,不是那个”的答案

不,我想让任务实例全局访问用户实例。@nimo23你是什么意思?您确定不希望在此处使用内部类吗?内部类(非静态嵌套类)将非常完美,因为我还需要访问任务对象中的许多用户属性/方法。但是,我想,最好将所有与任务相关的道具/方法提取到自己的文件中,因为User.class实际上太大了。它应该是用户和任务之间的双向关系。另一种方法可以是创建一个由
User
task
对象组成的
UserTask.class
。任务对象应该如何访问用户方法?它应该是用户和任务之间的双向关系。我明白了,所以您希望任务是用户的一个子类。然后你应该阅读继承:
公共类任务扩展用户{}
问题是用户是一个JPA实体类..用用户扩展任务对JPA来说并不简单..然而,我找到了一个解决方案:“你在这里创建了一个非常奇怪的依赖关系”->双向关系并不奇怪。“用户类有太多字段”->是的,我想将许多字段和方法外包给另一个类(Task.java),并用一个名为Task的字段替换User.java中的字段。@nimo23除非您开始违反“单一责任原则”。