包含HashMap的Singleton-Generic mixin类<classname,list <class =“”objects =“”>:输入安全警告

时间:2017-10-04 14:30:21

标签: java javafx singleton

我正在开发一个项目(javaFX),其中存在多个bean类和每个ViewModel类的bean类。 ViewModelbean字段映射到Property字段,我们在该字段中处理/处理应用程序中的数据。 REST服务检索bean的数据,只有在某处引用它们时才可用(否则,垃圾收集器会吞下它们)。

加载的数据显示在TableView中,取决于搜索条件(=用户输入)。如果处理新搜索 - 与搜索条件无关 - 以前的TableView数据清空 - 因此垃圾收集器会收集所有显示的数据对象。

要立即为多个选定数据对象(例如人员)启用数据处理,我希望将所选数据对象存储到静态容器中,以防止它们被垃圾收集器收集。我想出了单例类 - 但是我不想为每个ViewModel类创建一个单例类。

我已经阅读了多篇关于此的帖子和讨论,并决定实现一个单例类(ContainerUtil),该类包含HashMap任何ViewModel类的ViewModel对象列表。该类的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。:我不太确定这篇文章是否更适合Code Review而不是Stack Overflow - 如果有,请通知我。

1 个答案:

答案 0 :(得分:0)

  1. 使用单例作为“数据存储”对我来说听起来不错。很容易使垃圾收集器不通过单例进行垃圾收集,但很难告诉垃圾收集器以后收集垃圾收集器。当然,如果你小心翼翼,那些数据仍然会在正确的时间被垃圾收集,但是你给自己一个机会犯下愚蠢的错误。
  2. 如果你坚持使用原始方法,那么这个警告是不可避免的,你只需要压制它。
  3. 我建议让TableView所在的班级保留自己的列表。我不明白为什么没有单身人士就无法存储这些数据。