亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用父對象創建子對象的字段實例

使用父對象創建子對象的字段實例

慕少森 2024-01-05 10:02:47
我有一個User(父母)和一個Task(孩子)。我需要每個任務中都有一個用戶實例,并且希望該任務在用戶中可用。版本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();}}版本2:public class User {private Task task;public getTask() {   if(task == null) {    task = new Task(this);   }   return task;}public void runTask() {   task.run();}}我想,第一個版本會進行急切的初始化,并且與執行此操作相同:版本3public 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(與其用戶相關)。
查看完整描述

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 類有太多字段,現在您為其添加了另一個職責,即運行“任務”。


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


找一些更有經驗的人來和你坐在一起。向他們解釋您的需求,并讓他們審查您的設計和代碼庫。這里沒有單一的“做這個,而不是那個”答案。


查看完整回答
反對 回復 2024-01-05
?
達令說

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

    }

}


查看完整回答
反對 回復 2024-01-05
?
翻過高山走不出你

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 中定義自己的構造函數。


查看完整回答
反對 回復 2024-01-05
  • 3 回答
  • 0 關注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號