Singleton-Generic mixin类保存HashMap :类型安全警告
我正在开发一个项目(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:我不太知道是否这个职位更适合代码审查,而不是堆栈溢出 - 如果是这样,请通知我。
- 使用单例作为“数据存储”对我来说听起来像个坏主意。让垃圾收集器不要通过单例垃圾收集很容易,但很难告诉垃圾收集器稍后收集垃圾收集器。当然,如果你仔细一点,那些数据仍然会在正确的时间被垃圾收集,但是你给自己一个犯下愚蠢错误的机会。
- 如果你坚持使用原始的方法,那么这个警告是不可避免的,你只需要压制它。
- 我建议让
TableView
保留自己的清单。我不明白为什么在没有单身人士的情况下存储这些数据是不可能的。
我不认为这会导致内存泄漏或s.th.一样。容器完全由用户和他们的需求来控制。当需要执行工作流程或进程[使用不同数据对象多次执行]时,将使用容器。用户将对目前使用的所有容器有视觉反馈,并且可以自由清除或修改其内容。因此,如果要执行的工作流程或流程已经完成,用户将不得不根据自己的兴趣清除它(执行其他工作流程或流程)。 此外'TableView's可能是易变的。 –
容器是否有共同的超类?那么你应该可以使用''和'Map >'。 –
daniu
我曾经执行过,但警告没有解决。 –