如果您要创建一个要重用的库,那么在单个数据类型/变量上创建一个类是否有意义(或在一般用途中)。例如,
class DataSet
{
private HashMap<String,String> mapping;
public String getKey();
public String getValue(String key);
}
假设我有一个方法 DataSet getDataSet()
,在我的 API 中使用这个返回 HashMap 的方法有意义还是应该返回 DataSet?
通过 java 集合类型返回 DataSet 的一些好处是 -
- 代码既简单又非常冗长且易于阅读。
- 在类(class)级别编写单元测试。
- 对内部存储结构进行更精细的控制 - 用户无法直接修改该集合。
这种方法有缺点吗?或者是否总是建议特别是在创建 API/库时使用自己的类而不是已知的 java 数据类型?
最佳答案
一般包装
至于是否使用包装器的一般问题,这取决于原因,并且可能因用例而异。
包装器的一些优点
- 类型安全:您可以包装原语以由编译器提供一些语义安全。例如,您可以使用类
Key
其中包含单个字符串,而不仅仅是String
指出里面的字符串是一个键。当多个字符串可能会混淆时,这可能会对您有所帮助。 - 访问控制:就像您所描述的那样,允许读/写访问等。
- “手动”AOP:用逻辑包装 setters/getters。
一些缺点:
- 代码更加冗长,可能更难理解/处理。
- 需要付出更多努力来编写所有这些包装器(最好是文档)。
- 集合、字符串等现有/常见数据类型得到了更广泛的理解,从而缓解了学习曲线。
返回 HashMap
如果你归还 map ,我就不会归还HashMap<String,String>
而是Map<String, String>
。
包装器与 map
此外,这取决于您想要实现的目标。当然,使用包装器对象可以让您更好地控制 API,但代价是需要维护更多代码。
委托(delegate)
除了使用 DataSet
正如您所描述的,委托(delegate)可能是一种选择,即看起来像映射但仅将调用委托(delegate)给内部映射的类。这样,您就可以在方法中添加功能,例如防止写入访问、以透明方式进行验证(对于只读映射,Collections
类中已经有委托(delegate)包装器)。
单元测试
至于“在类(class)级别编写单元测试”。我想说这也取决于包装器会做什么。如果它只是类似于 map ,那么为该包装器创建测试可能会有点浪费时间(您可以只使用现有的且已经测试过的 map 实现)。此外,您可能会测试对包装器/映射进行操作/返回的功能,并且这些测试基本上与您使用包装器还是映射无关。
这只是我的2 50 美分;)
关于java - 在java中通过单个变量创建一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34765910/