3 回答

TA貢獻1853條經驗 獲得超9個贊
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);
但這里真正的問題是不同的:你在這里創建了一個非常奇怪的依賴關系。您已經說過您的 User 類有太多字段,現在您為其添加了另一個職責,即運行“任務”。
因此,真正的答案是:退后一步。
找一些更有經驗的人來和你坐在一起。向他們解釋您的需求,并讓他們審查您的設計和代碼庫。這里沒有單一的“做這個,而不是那個”答案。

TA貢獻1821條經驗 獲得超6個贊
版本 2 可能會導致NullPointerException,因為您始終必須getTask()先調用runTask(),否則NullPointerException會拋出異常。
Task您可以在運行實例之前創建實例
public class User {
private Task task;
public void runTask() {
if (task == null) {
task = new Task(this);
}
task.run();
}
}

TA貢獻1875條經驗 獲得超3個贊
由于您的評論澄清了一些事情,因此您可能應該采取以下方法:
public class User {
private Task task;
public User()
{
}
public void runTask()
{
if(task == null)
{
task = new Task();
}
task.run();
}
}
public class Task extends User {
public Task()
{
}
}
這樣,Task就會繼承User的所有方法和屬性。我不完全確定這會如何影響 User 的構造函數,這取決于類的其余部分到底是什么樣子?,F在,您可以使用與 User 相同的構造函數來調用 Task,也可以使用 User 構造函數的參數和其他參數(如果需要)在 Task 中定義自己的構造函數。
添加回答
舉報