2014-02-24 62 views
1

我一直在考慮使用generic factory pattern來實現此目的,但是我只是想確保正確使用它。正確的設計模式在運行時更改數據類型實例

首先,由於客戶需要,這必須是基於Java的。

我的應用程序可以實例化幾個對象,並且每個對象都應該能夠在運行時更改類型。例如,一個變量可以以浮點形式出現,可以轉換爲int形式,然後轉換爲char形式,然後轉換回浮動形式。這將是一個基本的例子,但是可以添加自定義數據類型以獲得額外的樂趣。

在這種情況下是否使用正確的工廠模式?或者,有什麼更好的?對我來說,工廠模式似乎更好地實例化和不更新(除非我實質上銷燬並重新實例化變量)。


更多細節:

這是一個漸進的算法,其中我並不知道這個類型在程序啓動時。根據進化的方式,它可能會發現一個整數比一個浮點更可取。

舉例來說,如果我開始的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的實例需要在整個執行持續下去,因爲這是我的進化算法中的一個對象,不能被破壞並重新實例化爲別的東西。

+0

類型的變量'float'不能成爲一個'int'一個ClassCastException將啓動。你的意思是'數字'?編程到接口?控制反轉?依賴注入? –

+0

是的,直接它不能。但是,對於我的應用程序,我需要轉換基本類型並找出一種方法來表示它。 – espais

+2

我仍然不明白你的期望或你正在嘗試做什麼。使所有的引用類型爲'對象'。 –

回答

1

如果你解釋爲什麼你想這樣做,這可能會有所幫助。根據您迄今爲止所說的話,您最好的選擇就是始終使用數字類型,然後存儲您需要的任何版本。例如number.toIntnumber.toDouble

對於更復雜的類型定義一個通用的接口,它們都實現,並使用該接口存儲它們,然後編寫合適的映射方法或使用一個庫,如推土機做映射爲您服務。

您將需要創建自己的類來處理這個問題。例如:

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 
     } 
    } 
} 
+0

編輯是爲了反映我真正想要的。本質上,我將在程序開始時定義類型,但這些可以改變程序的執行。我希望有一個可擴展的模式可以用來處理這種類型的變化,因爲它並不總是像int類型那樣簡單。它可能是一個複雜的數據結構,可以轉換爲其他可比較的數據結構。 – espais

+1

這聽起來好像你太過複雜了。例如,是否有任何理由不能總是使用'double'來表示數字數據?或'BigDecimal'如果精度比速度更重要... –

+0

在同一個執行過程中,數據類型可能會從double到int更改爲bool到自定義類(進化算法的樂趣在於發生了什麼是任何人的猜測)。但是,如果我不需要,我絕對不想過度複雜。 – espais

0

也許這可以提供幫助。

通過提供一個通用方法,返回類型被轉換爲變量的類型以保存結果。如果類型不兼容

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); 
} 

}

相關問題