2017-04-14 97 views
1

要清楚:我有一個對象,它在運行時期間連續地更改其值,並且我想將創建和修改的對象保存在文件上。 我發現如何做到這一點,我也發現如何讀回對象保存到另一個。但問題是:是否可以用我想要檢索的對象所在的文件的唯一參數調用我的對象的類構造函數?在構造函數中從已保存的對象中創建一個對象

NeuralNetwork(File fs){ 
    ObjectInputStream ois; 
    changeFileSave(fs);  //just sets the file as savefile for the future 
    try{ 
     ois = new ObjectInputStream(new FileInputStream(_saveNet)); //_saveNet = fs 
     this = (NeuralNetwork) ois.readObject(); 
    } 
    catch(Exception e){ 
     //error message 
    } 
} 

它給我上「這個=」 如果可能的錯誤我怎麼做這樣的事?

謝謝

+0

你不能這樣做,你必須將從readObject()方法檢索到的NeuaralNetwork中的每個變量都設置爲正在創建的當前NeuralNetwork中的變量。 –

+1

好的模式將是一個方法'公共靜態NeuralNetwork loadFromFile(文件FS);' – RobCo

回答

1

的關鍵字,這是一個只讀的參考,你可以甚至從來沒有在構造函數中寫this =。而且,java中的構造函數不返回任何東西。

你必須把你讀過的對象一個接一個(或使用反射)映射到你正在實例化的對象中的屬性。

但是,我會通過將一個文件傳遞給構造函數並在其中執行IO來提交您違反了關注點分離。通過這樣寫東西,你永遠將一個神經網絡與一個文件綁定在一起,並伴隨着大量伴隨的問題,包括(不限於)你可能在某處存儲你的值的事實。

IMO你最好用factory pattern來建立你的對象,並使你的NeuralNetwork對象成爲一個普通的對象。然後模糊消失,因爲你的工廠方法可以簡單地返回(NeuralNetwork) ois.readObject();

1
this = (NeuralNetwork) ois.readObject(); 

考慮this爲隱藏final參數指向正在執行方法的實例。它的價值不能改變。如果你想爲一個實例創建一個變量點,只要你不使用this就沒有問題。

對於factoryfactory method,您希望做的事情比構造函數更適合。使用這種模式之一(或者如果你想保持它非常簡單,使用靜態方法)從文件中創建你的實例。不知道您是否需要該類的許多實例,但如果您只需要一個實例,則應考慮使用方法而不是前面提到的方法。

0

您不能指定this,因爲它是隻讀的。 this總是指向實例本身,並在對象的整個生命週期中用於訪問其方法和屬性。

如果你想從文件中讀取數據來創建NeuralNetwork類的實例,你可以使用一個工廠方法:

public class NeuralNetwork { 

    private NeuralNetwork() { // private constructor forces us to use the 
    }       // factory method to create instances 

    public static NeuralNetwork loadFromFile(File fs) { 
     ObjectInputStream ois; 
     this.changeFileSave(fs); // just sets the file as savefile for the future 
     try { 
      ois = new ObjectInputStream(new FileInputStream(_saveNet)); 
      return (NeuralNetwork) ois.readObject(); 
     } 
     catch(IOException e){ 
      throw UncheckedIOException(e); 
     } 
    } 

    // other methods and attributes 
} 

然後,無論你用你的NeuralNetwork類,需要一個實例,使用:

NeuralNetwork network = NeuralNetwork.loadFromFile(someFs); 
// use network instance and have fun with it here 

注1:我已經定義了一個私有構造函數來強制大家使用loadFromFile工廠方法來創建一個實例。這意味着這個類只能從這個類的靜態方法中創建。

注2:我也重新拋出了一個未經檢查的異常。這是個人的品味。我不會只記錄異常並繼續。相反,我會拋出異常,以便調用者正確處理它,因爲如果尚未創建類的實例,則繼續進行下去是沒有意義的。如果您不希望重新拋出異常作爲未檢查的異常,只是不要抓住原始的IOException並將throws IOException子句添加到工廠方法中。這將迫使loadFromFile的呼叫者趕上IOException並處理它。

相關問題