2017-04-14 154 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并处理它。

相关问题