Java 重构泛型
坦率地说,我远不是泛型专家,我必须重构一些代码。 我有三个子类:classD、classR和classS。 每个类都扩展了classAbstractA。 子类的目标非常相似,每个子类在方法m()中都有类似的代码。因此,我认为如果我能从子类中提取方法m()并将其替换一级(到类AbstractA中),那就不错了 但也有一些区别: D类可与以下各项配合使用:Java 重构泛型,java,generics,refactoring,Java,Generics,Refactoring,坦率地说,我远不是泛型专家,我必须重构一些代码。 我有三个子类:classD、classR和classS。 每个类都扩展了classAbstractA。 子类的目标非常相似,每个子类在方法m()中都有类似的代码。因此,我认为如果我能从子类中提取方法m()并将其替换一级(到类AbstractA中),那就不错了 但也有一些区别: D类可与以下各项配合使用: Map<String, Map<BigInteger, BigInteger>> counts = new HashMa
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, Set<BigInteger>>> sums = new HashMap<String, Map<BigDecimal, Set<BigInteger>>>();
Map<String, Map<String, BigInteger>> counts = new HashMap<String, Map<String,BigInteger>>();
Map<String, Map<BigDecimal, Set<String>>> sums = new HashMap<String, Map<BigDecimal, Set<String>>>();
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, BigInteger>> sums = new HashMap<String, Map<BigDecimal, BigInteger>>();
Map counts=newhashmap();
Map sums=新的HashMap();
R类与:
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, Set<BigInteger>>> sums = new HashMap<String, Map<BigDecimal, Set<BigInteger>>>();
Map<String, Map<String, BigInteger>> counts = new HashMap<String, Map<String,BigInteger>>();
Map<String, Map<BigDecimal, Set<String>>> sums = new HashMap<String, Map<BigDecimal, Set<String>>>();
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, BigInteger>> sums = new HashMap<String, Map<BigDecimal, BigInteger>>();
Map counts=newhashmap();
Map sums=新的HashMap();
和类S一起工作:
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, Set<BigInteger>>> sums = new HashMap<String, Map<BigDecimal, Set<BigInteger>>>();
Map<String, Map<String, BigInteger>> counts = new HashMap<String, Map<String,BigInteger>>();
Map<String, Map<BigDecimal, Set<String>>> sums = new HashMap<String, Map<BigDecimal, Set<String>>>();
Map<String, Map<BigInteger, BigInteger>> counts = new HashMap<String, Map<BigInteger,BigInteger>>();
Map<String, Map<BigDecimal, BigInteger>> sums = new HashMap<String, Map<BigDecimal, BigInteger>>();
Map counts=newhashmap();
Map sums=新的HashMap();
关于上述泛型的可能修改的任何提示都是受欢迎的,这可能会产生一个更“通用”的版本(可以移动到类AbstractA,并且仍然可以被三个子类使用。)您需要做的第一件事是在
String
和BigInteger
之间创建一些通用性。我的建议是创建一个新类,该类由以下两种类型组成:
public class Special
{
private String string;
private BigInteger bigInt;
...
}
现在您可以更改贴图的参数,如下所示:
Map<String, Map<Special, BigInteger> ...
Map下面的实现如何
公共抽象类AbstractA{
受保护地图计数;
保护映射和;
公屋{
//使用计数和和的因式分解代码
}
}
公共类D扩展了AbstractA{
公共D(){
计数=新的HashMap();
sums=新的HashMap();
}
}
公共类R扩展了AbstractA{
公共资源({
计数=新的HashMap();
sums=新的HashMap();
}
}
公共类S扩展了抽象{
公共服务({
计数=新的HashMap();
sums=新的HashMap();
}
}
抽象类A{
映射计数=新的HashMap();
Map sums=新的HashMap();
}
类AbstractB扩展了AbstractA{
}
类D扩展了抽象B{
}
类R扩展了抽象b{
}
类S扩展了抽象{
}
您只需要两个通用参数:
public abstract class AbstractA<K, V> {
private Map<String, Map<K, BigInteger>> counts = new HashMap<String, Map<K, BigInteger>>();
private Map<String, Map<BigDecimal, V>> sums = new HashMap<String, Map<BigDecimal, V>>();
public void m() {
}
}
public class D extends AbstractA<BigInteger, Set<BigInteger>> {
}
public class R extends AbstractA<String, Set<String>> {
}
public class S extends AbstractA<BigInteger, BigInteger> {
}
公共抽象类AbstractA{
私有映射计数=新HashMap();
私有映射和=新HashMap();
公屋{
}
}
公共类D扩展了AbstractA{
}
公共类R扩展了AbstractA{
}
公共类S扩展了抽象{
}
不确定如何将字符串
与比特格尔
进行协调……可能是字符串
如473894790327849328490829042
,可以转换为大整数
?如果显示m()的三个实现的代码,就会更容易考虑这一点
您要替换的类。请记住,如果有人想添加一个与m()版本完全不同的类Q,这个解决方案对其他程序员来说将是一件非常痛苦的事情。@luiges90我想是的,但这可能意味着一个实现会进行一些解析,而另一个则不会。这不能只用泛型来解决。