【问题标题】:Correct design pattern to change instance of data type at run time更正设计模式以在运行时更改数据类型的实例
【发布时间】:2014-02-24 22:38:08
【问题描述】:

我一直在考虑为此使用generic factory pattern,但我只是想确保我正确使用它。

首先,由于客户的需要,这必须是基于 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

我最初的想法是拥有一个通用工厂类型对象,我可以在其中跟踪对象的当前“类型”并返回适当的值。所以一开始它会返回一个float,转换之后会返回一个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 的实例需要在整个执行过程中持续存在,因为它是我的进化算法中的一个对象,不能被销毁并重新实例化为其他东西。

【问题讨论】:

  • float 类型的变量不能成为int。你的意思是Number?编程接口?控制反转?依赖注入?
  • 是的,直接不行。但是,对于我的应用程序,我需要转换基本类型并找出一种表示它的方法。
  • 我仍然不明白您的期望或您想要做什么。将您的所有引用都设为Object
  • 添加了更多说明...希望对您有所帮助。

标签: java design-patterns factory


【解决方案1】:

如果您解释为什么要这样做,它可能会有所帮助。根据您到目前为止所说的内容,您最好的选择就是始终使用类型作为数字,然后存储您需要的任何版本。例如number.toIntnumber.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
        }
     }
}

【讨论】:

  • 编辑是为了反映我真正想要的。本质上,我将在程序开始时定义类型,但这些类型可以随着程序的执行而改变。我想要一个可扩展的模式来处理这种类型更改,因为它并不总是像类型转换为 int 那样简单。它可能是一个复杂的数据结构,可以转换为其他可比较的数据结构。
  • 听起来你真的把这件事复杂化了。例如,您有什么理由不能总是将double 用于数字数据?或者 BigDecimal 如果准确性比速度更重要...
  • 数据类型可能会在同一执行过程中从 double 变为 int 再到 bool 到自定义类(进化算法的乐趣在于,发生的事情是任何人的猜测)。如果我不需要,我绝对不想让它过于复杂。
  • @espais 见编辑。不过,我仍然会先检查您的架构,您似乎确信您需要这样做,但我真的很怀疑您是否这样做。
  • 感谢您的更新。我确信我需要这样的东西的原因是,数据并不总是数字的。正如我所提到的,我基本上有一个对象通过一个需要灵活类型的进化算法(我正在扩展一个预先存在的框架,所以我真的不想过多地处理它如何处理对象)。数字更多用于示例...
【解决方案2】:

也许这会有所帮助。

通过提供泛型方法,将返回类型转换为保存结果的变量的类型。如果类型不兼容,将启动 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);
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多