2017-10-04 50 views
0

我正在開發一個項目(javaFX),其中存在多個bean類和ViewModel類,每個bean類都存在。 A ViewModel將每個bean字段映射到Property字段,我們使用該字段在我們的應用程序中處理/處理數據。 bean的數據由REST服務檢索並且只有在某個地方被引用(否則垃圾回收器會吞下它們)。Singleton-Generic mixin類保存HashMap <ClassName,List <Class objects>:類型安全警告

加載的數據顯示在TableView中,取決於搜索條件(=用戶輸入)。如果處理新的搜索 - 與搜索標準無關 - 先前的TableView數據清空 - 所以垃圾收集器收集所有顯示的數據對象。

要一次爲多個選定的數據對象(例如人員)啓用數據處理,我希望將選定的數據對象存儲到靜態容器中,以防止它們被垃圾收集器收集。我想出了singleton類 - 但我不想爲每個ViewModel類創建一個單例類。

我已閱讀多篇文章和關於此的討論,並決定實施一個singleton類(ContainerUtil),該類包含任何ViewModel類的ViewModel對象列表的HashMap列表。該類的String名稱被用作Key,並且各自的List被用作其Value

我嘗試了與Class<?>E不同的實現,但總是有一個類型安全錯誤,這是我想要阻止的。所以我開始重新考慮我的解決方案,現在我不確定

  • 如果這真的是很好的實踐嗎?
  • 如果我在我的代碼/思想中丟失了一些重要的東西,可能會阻止我進入未經檢查的類型安全警告?
  • 如果可能有更好的方法來解決所描述的問題?

任何意見或批評與我的方法是值得歡迎的!

因此,這裏是我的代碼:

public class ContainerUtil 
{ 
    private static final ContainerUtil instance; 
    private final Map<String, List<?>> instances_map; 


    /** 
    * <p>Constructor of Class {@link ContainerUtil}</p> 
    * <p>Is private to prevent other methods to instantiate this class!</p> 
    */ 
    private ContainerUtil() 
    { 
     // only a single instance allowed 
     this.instances_map = new HashMap<>(); 
    } 

    static 
    { 
     // Instantiates the one allowed instance at application start 
     instance = new ContainerUtil(); 
    } 

    /** 
    * @return The one instance of {@link ContainerUtil} 
    */ 
    public static ContainerUtil getInstance() 
    { 
     return instance; 
    } 

    /** 
    * <p>Creates (if not existing in the {@link #instances_map}) and returns a list (=container) of objects of the given class<p> 
    * @param containerClass - The class of which a container is needed 
    */ 
    public <E> List<E> getContainerForClass(final Class<E> containerClass) 
    { 
     if (!instances_map.containsKey(containerClass.getName())) 
     { 
      List<E> container = new ArrayList<>(); 
      instances_map.put(containerClass.getName(), container); 
     } 
     return (List<E>) instances_map.get(containerClass.getName()); 
     //  ^^^^^^^^^ unchecked type safety warning 
    } 

} 

P.S:我不太知道是否這個職位更適合代碼審查,而不是堆棧溢出 - 如果是這樣,請通知我。

+0

容器是否有共同的超類?那麼你應該可以使用''和'Map >'。 – daniu

+0

我曾經執行過,但警告沒有解決。 –

回答

0
  1. 使用單例作爲「數據存儲」對我來說聽起來像個壞主意。讓垃圾收集器不要通過單例垃圾收集很容易,但很難告訴垃圾收集器稍後收集垃圾收集器。當然,如果你仔細一點,那些數據仍然會在正確的時間被垃圾收集,但是你給自己一個犯下愚蠢錯誤的機會。
  2. 如果你堅持使用原始的方法,那麼這個警告是不可避免的,你只需要壓制它。
  3. 我建議讓TableView保留自己的清單。我不明白爲什麼在沒有單身人士的情況下存儲這些數據是不可能的。
+0

我不認爲這會導致內存泄漏或s.th.一樣。容器完全由用戶和他們的需求來控制。當需要執行工作流程或進程[使用不同數據對象多次執行]時,將使用容器。用戶將對目前使用的所有容器有視覺反饋,並且可以自由清除或修改其內容。因此,如果要執行的工作流程或流程已經完成,用戶將不得不根據自己的興趣清除它(執行其他工作流程或流程)。 此外'TableView's可能是易變的。 –

相關問題