Java 正确的设计模式以在运行时更改数据类型的实例

Java 正确的设计模式以在运行时更改数据类型的实例,java,design-patterns,factory,Java,Design Patterns,Factory,我一直在考虑使用a来实现这一点,但是我只想确保我正确地使用它 首先,由于客户端的需要,这必须是基于Java的 我的应用程序可以实例化几个对象,每个对象都应该能够在运行时更改类型。例如,一个变量可以从浮点开始,转换为int,然后转换为char,然后再转换回浮点。这将是一个基本的示例,但是可以添加自定义数据类型以获得额外的乐趣 在这种情况下,通用工厂模式是正确的吗?或者,还有更好的吗?对我来说,工厂模式似乎更擅长实例化而不是更新(除非我基本上销毁并重新实例化了变量) 更多详情: 这是一个进化算法,

我一直在考虑使用a来实现这一点,但是我只想确保我正确地使用它

首先,由于客户端的需要,这必须是基于Java的

我的应用程序可以实例化几个对象,每个对象都应该能够在运行时更改类型。例如,一个变量可以从浮点开始,转换为int,然后转换为char,然后再转换回浮点。这将是一个基本的示例,但是可以添加自定义数据类型以获得额外的乐趣

在这种情况下,通用工厂模式是正确的吗?或者,还有更好的吗?对我来说,工厂模式似乎更擅长实例化而不是更新(除非我基本上销毁并重新实例化了变量)


更多详情:

这是一个进化算法,我不一定知道程序启动时的类型。根据进化过程,它可能会发现int比float更可取

例如,如果我以浮点值4.34开始:

// start of program
object var = 4.34;

// evolution running......
...

// evolution determines that var would be better as a float
var.convertToInt();

// var is now an int with a value of 4
我最初的想法是拥有一个通用的工厂类型对象,在这里我跟踪对象的当前“类型”,并返回适当的值。因此,在开始时它将返回一个
浮点值
,转换后将返回int转换后的值(映射到内部
int


编辑2:代码澄清

我想我的观点没有被理解。下面是我希望看到的代码方面的示例

object var = new object(int, 4);    // create int variable with value of 4
// where object is whatever base design pattern i am using here
...
var.toFloat();                      // convert var to float, value is now 4.0
System.out.println(var.getValue()); // prints 4.0
...
var.toCustomClass();                // var is now a custom datatype
System.out.println(var.getValue()); // calls the print method of the class

我还应该提到,
var
的实例需要在整个执行过程中保持不变,因为它是我的进化算法中的一个对象,不能被销毁并作为其他对象重新实例化。

如果您解释为什么要这样做,它可能会有所帮助。根据您迄今为止所说的,您最好的选择就是始终使用类型作为数字,然后存储您需要的任何版本。例如
number.toInt
number.toDouble

对于更复杂的类型,请定义一个通用接口,它们都使用该接口实现并存储它们,然后编写适当的映射方法或使用库(如Dozer)为您进行映射

您需要创建自己的类来处理这个问题。例如:

public class Value {
     Object value;

     Object getValue();


     void toInteger() {
        if (value instanceof Number) {
           value = Integer.valueOf(((Number)value).intValue());
        } else {
           // Handle the conversion however you handle it
        }
     }
}
也许这会有帮助

通过提供泛型方法,将返回类型转换为变量的类型以保存结果。如果类型不兼容,将启动ClassCastException

public class Wrapper {

private Object src;

public Wrapper(Object o) {
    src = o;
}
public String getType(){
    return src.getClass().getName();
}

public <E> E getValue() {
    return (E)src;
}
public void toInteger(){
    //dummy implementation
    if(src instanceof Double){
        src=new Integer(String.valueOf((int)Math.floor((Double)src)));
    }
}

public static void main(String args[]){
    Wrapper wrapper=new Wrapper(new Double(4.8));
    System.out.println(wrapper.getType());
    Double myDouble=wrapper.getValue();
    System.out.println(myDouble);
    wrapper.toInteger();
    System.out.println(wrapper.getType());
    Integer myInteger=wrapper.getValue();
 // Double exceptionInProgress = wrapper.getValue();
    System.out.println(myInteger);
}
公共类包装器{
私有对象src;
公共包装器(对象o){
src=o;
}
公共字符串getType(){
返回src.getClass().getName();
}
公共E getValue(){
返回(E)src;
}
公众人士{
//虚拟实现
if(src instanceof Double){
src=新整数(String.valueOf((int)Math.floor((Double)src));
}
}
公共静态void main(字符串参数[]){
包装器=新包装器(新双(4.8));
System.out.println(wrapper.getType());
Double myDouble=wrapper.getValue();
系统输出打印项次(myDouble);
toInteger()的包装器;
System.out.println(wrapper.getType());
整数myInteger=wrapper.getValue();
//Double exceptionInProgress=wrapper.getValue();
System.out.println(myInteger);
}

}

类型为
float
的变量不能成为
int
。你是说编号吗?编程到接口?控制反转?依赖注入?是的,它不能直接注入。然而,对于我的应用程序,我需要转换基类型并找出一种表示它的方法。我仍然不理解您的期望或尝试做什么。将你所有的引用类型设置为
Object
。添加了更多说明…希望能有所帮助。编辑的目的是反映我真正想要的。基本上,我将在程序开始时定义类型,但是这些类型可以随着程序的执行而改变。我希望有一个可扩展的模式可以用来处理这种类型更改,因为它并不总是像类型转换为int那么容易。它可能是一个复杂的数据结构,可以转换为其他类似的数据结构。听起来你把这件事复杂化了。例如,有什么原因不能总是对数字数据使用
double
?或者
BigDecimal
如果准确性比速度更重要……数据类型可能会在同一执行过程中从double变为int,从bool变为自定义类(进化算法的乐趣在于所发生的事情是任何人都能猜到的)。不过,如果我不需要的话,我绝对不想让它过于复杂。@espais请参见编辑。不过我还是会先检查你的架构,你似乎确信你需要这样做,但我真的很怀疑你是否需要。谢谢你的更新。我确信我需要这样的东西的原因是数据不总是数字的。正如我提到的,我基本上有一个对象被传递到一个需要灵活类型的进化算法中(我正在扩展一个预先存在的框架,所以我真的不想在它如何处理对象的问题上纠缠太多)。数字更像是一个例子。。。