Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存储实际的类逻辑/蓝图并再次加载_Java_Serializable_Objectoutputstream_Objectinputstream - Fatal编程技术网

Java 存储实际的类逻辑/蓝图并再次加载

Java 存储实际的类逻辑/蓝图并再次加载,java,serializable,objectoutputstream,objectinputstream,Java,Serializable,Objectoutputstream,Objectinputstream,如果我有这样一门课: 类Foo实现HasBarMethod{ 公共双栏(双x){ 返回x*x; } } 现在我有 Foo-Foo=new-Foo(); someObjectOutputStreamToSomeFile.writeObject(foo); 它被执行了。后来我决定更改Foo的定义,如下所示: 类Foo实现HasBarMethod{ 公共双栏(双x){ 返回x+x; } } 是否有可能做到: HasBarMethod foo=(HasBarMethod)someObjectInp

如果我有这样一门课:

类Foo实现HasBarMethod{
公共双栏(双x){
返回x*x;
}
}
现在我有

Foo-Foo=new-Foo();
someObjectOutputStreamToSomeFile.writeObject(foo);
它被执行了。后来我决定更改Foo的定义,如下所示:

类Foo实现HasBarMethod{
公共双栏(双x){
返回x+x;
}
}
是否有可能做到:

HasBarMethod foo=(HasBarMethod)someObjectInputStreamFromSameFile.readObject();
Hasbar方法没有改变。现在我想从foo.bar(x)中得到x的平方,而不是求和。这可能吗


当然,我应该用不同的名称创建不同的类Foo1,Foo2,…,作为一个好的实践。如果我正在制作一个包含不同类型博客的网站,我会的。但是,考虑到我正在做实验性的工作(大量的数字和解释它们的方法),如果不必深入到编写大型类继承结构的所有细节,那就太好了,因为不同的Foo类只有很小的适应性

Java序列化节省了字段。这些方法的说明保存在类文件中


也许可以考虑保存不同的类文件和不同的类加载器,或者使用字节码库根据输入文件进行小的更改,尽管这两者可能都比为不同的行为使用不同名称的类要复杂得多。

如果我没弄错的话,您希望实现一个类,该类的行为会根据情况动态变化。您可以实现一种常见模式(对不起,不记得它的名称):

这将允许您根据类的状态或您希望考虑的任何其他条件更改类使用的策略

其用法示例如下:

public static void main(String args[]){
    HasBarMethod defaultStrategy = new Sum();
    DynamicBehavior dyn = new DynamicBehavior(defaultStrategy);


    if( /*condition*/ ){
        dyn.setStrategy(new Multiply());
    }

    double result = dyn.bar(5);
}

您还可以将策略函数对象转换为基类的静态字段,因为这样可以避免在每次决定切换策略时创建它们的新实例,从而节省一些内存和时间。

正如其他人所说:序列化只处理类实例中的数据。因此,如果您修改一个类,然后对修改前编写的流进行反序列化,您将收到修改后的类的实例;或者,如果新类与旧类的序列化形式不“兼容”,则为异常。-不管怎么说,这是一种不好的做法,所以你不应该为这个问题而烦恼。很抱歉我不清楚。我知道序列化的作用,我知道它不存储类逻辑;)在我的例子中,我使用一个神经网络,可以为它定义不同的输入。我在输入中添加了一些特性,调试等等。但这很容易把事情搞砸,因为如果在使用或测试过程中提供的输入不同,经过训练的网络将毫无意义。目前,我将java代码存储为文本。为每次更改创建一个新类是痛苦的,将所有内容参数化也是痛苦的。不过,感谢您花时间关注我正在做的事情:)还有一个重要的注意事项,每次运行时,只使用一个类逻辑实例:)您是否考虑过使用类似CVS或SVN的工具来跟踪代码和数据的更改?感谢您就如何通过继承解决此问题发表了详细的评论。然而,这并不是我想要的,因为每个类都会有小的差异,而且会有很多类。很多课都不好,这让一切都乱七八糟。我想说清楚,这不是继承,而是组成。您还可以将策略类实现为嵌套类或匿名内部类。我不认为有任何方法可以避免编写他们的代码。你知道了,我将保存java并调用运行时编译器。然后,也许可以看看。
public static void main(String args[]){
    HasBarMethod defaultStrategy = new Sum();
    DynamicBehavior dyn = new DynamicBehavior(defaultStrategy);


    if( /*condition*/ ){
        dyn.setStrategy(new Multiply());
    }

    double result = dyn.bar(5);
}