麻烦给我详细介绍下JAVA中用了泛型的好处,是不是用了泛型就可以不用NEW去创建对象了?

2024-11-24 23:31:12
推荐回答(3个)
回答1:

1. 泛型的却很有用, 如果跟反射可以配合用好, 普通企业应用得代码量可以减少非常多.
2. python之类type inference语言比java更适合做这种template抽象

举个例子: 企业程序大部分程序是实体信息管理得, 真正涉及交易清算得只有极小一部分
对于所有得实体管理, 基本上都是增,删, 改, 查看, 查找等等几个功能
我现在用了几个框架, 经典结合方式:webwork+spring+hibernate, 分析如下:

hibernate O/R Mapping没什么花头, 为每个实体管理都要写一个映射类, 一般跟实体得数目差不多, 有时候为了避免关联, 建几个视图映射会多点. But, 这个能用hibernate自己写得工具生成, 维护一个java类文件, 以及里面得meta description.
或者自己写个程序生成( 给定数据源,, 输出java类文件, 以及hbm .xml文件 ), 这个只需要维护sql语句就兴了, 我通常这么做.

1. 不用泛型, 不用反射
spring层要写5个service(假设一个实体对应一个service), 分别实现读实体, 加实体, 删实体, 根据条件查找实体List这些功能.

要写5个不同得实体类得Action, 然后Action里面实现校验, 增加, 修改, 删除, 列表得功能, 每一个类要实现得功能同样也类似.

这些都没多少重构实质性得体现, 好处不明显, 可以提取得公共代码非常少.

2. 不用泛型, 用反射
在 1 得基础之上, 可以重构提取出一个公共service, 将分散在5个service得公共代码kill掉. 多出一个根据实体类参数操作得公共类, 但是类得数量增加一个.

同样Action也可以提出一个baseaction来

重构消去了一部分代码, 每个service得代码还是存在重复代码, 但是这个还可以通过反射合成一个service, 不过掉用者要用反射调用

对于action因为需要配置, 除非webwork支持类型得注入, 否则, 不好消去.
如果webwork spring 支持实体类型得注入, 那么到此可以结束, 只写一套逻辑, 代码也没有重复, 由于精力有限, 没有去深入研究spring AOP跟webwork 得inteceptor机制, 不知道支持不支持.

3.用泛型, 用反射
在1得基础上引入泛型, 写一个泛型service, 写一个泛型webwork action , 也没有研究过xwork中泛型对象是怎么配置产生得, 如果支持配置, 只需要写一个action即可, 如果不支持, 需要为每个实体类写一个webwork action

同样页面也是这个样子

但是, java得泛型用了一把, 不说对很多东西支持得很差, 光写法上来看, 跟C++ template一致, 仍然是一大堆得<>, 让初学者吐血, 变成高手炫耀得奇技淫巧. 比起python之类动态类型安全语言type inference机制相差太远, java泛型还有很长得路要走, 不过静态语言走到type inference上来得话, 编译类型检查得好处就没了, 所以java这方面永远不可能~~~
通过上面考虑, 我觉得python更适合web管理程序, 对于很多entity management得程序完全可以写出一个服务所有, 仅仅是O?Rmapping就没办法省. 不知道python有没有类似java得反射, 如果有得话会更好, 可以写出更通用, 量更少得代码. 相信ruby on rails成功也有这方面得原因(我没用过ruby, 错了也别骂我), 毕竟代码越少越好, 尤其是重复代码

我得主张是kill掉all重复代码, 只要能抽象统一得代码重复就是罪过, 哈哈, 相信用python可以把这个做得更好, 越来越喜欢python语言得特性了, 可惜还没拿他来做过web程序

回答2:

个人浅显理解,同样是一个 向量,里面可以存任何对象,Sring int 其他引用类型等,在需要这些内容时用户要获得他们就要GET,但是不知道向量里存的什么,如果想要int型的内容,取出来之后有可能是Sring型的,就会导致错误,加上泛型之后,规定向量里只能存储一种类型,这样取出内容时不会导致上诉错误

回答3:

给你举个例子
你先写一个类
public class Person{
中间有人的name sex 等属性
}

当你在另外的类中查询所有的人,将他们都存到一个集合list中时.
你就可以这么写
List list = "你查询到的东西"
这样你就比较方便,可以减少异常