重复此java代码重复
作者:互联网
我有大约10个类,每个类都有一个LUMP_INDEX和SIZE静态常量.
我想要一个这些类的数组,其中数组的大小是使用这两个常量计算的.
目前我有一个函数为每个类创建数组,有些内容如下:
private Plane[] readPlanes()
{
int count = header.lumps[Plane.LUMP_INDEX].filelen / Plane.SIZE;
Plane[] planes = new Plane[count];
for(int i = 0; i < count; i++)
planes[i] = new Plane();
return planes;
}
private Node[] readNodes()
{
int count = header.lumps[Node.LUMP_INDEX].filelen / Node.SIZE;
Node[] nodes = new Node[count];
for(int i = 0; i < count; i++)
nodes[i] = new Node();
return nodes;
}
private Leaf[] readLeaves()
{
int count = header.lumps[Leaf.LUMP_INDEX].filelen / Leaf.SIZE;
Leaf[] leaves = new Leaf[count];
for(int i = 0; i < count; i++)
leaves[i] = new Leaf();
return leaves;
}
等等
这些函数中有10个,唯一的区别是类类型,因此您可以看到,存在大量重复.
有没有人对如何避免这种重复有任何想法?
谢谢.
(之前我问了一个类似的问题,但我想我问的方式有点过时了)
解决方法:
Okey doke …我已经对此进行了测试以确保,我相信它可以满足您的需求.
你需要一个界面:
public interface MyInterface
{
public int getSize();
public int getLumpIndex();
}
您的类实现该接口:
public class Plane implements MyInterface
{
...
public int getSize()
{
return SIZE;
}
public int getLumpIndex()
{
return LUMP_INDEX;
}
}
在标题是实例的类中,你有……
public <E extends MyInterface> E[]
getArray(Class<E> c, MyInterface foo)
{
int count = lumps[foo.getLumpIndex()].filelen / foo.getSize();
E[] myArray = (E[]) Array.newInstance(c, count);
for(int i = 0; i < count; i++)
myArray[i] = c.newInstance();
return myArray;
}
您可以将它称为您的Plane类:
Plane[] p = header.getArray(Plane.class, this);
我认为? :)有人可以看看这个,看看我是否已经关闭?
(编辑:Becasue我现在测试了 – 这有效)
另外,您可以通过使getArray()将size和index作为参数来消除每个类中的getter:
public <E extends MyInterface> E[]
getArray(Class<E> c, int size, int index)
{
int count = lumps[index].filelen / size;
E[] myArray = (E[]) Array.newInstance(c, count);
for(int i = 0; i < count; i++)
myArray[i] = c.newInstance();
return myArray;
}
称之为:
Plane p[] = header.getArray(Plane.class, SIZE, LUMP_INDEX);
来自你的课程.接口只是变空,以提供泛型类型,您不必定义getter方法.
或者(最后编辑我保证,但这确实给你选择并解释了一些关于泛型)
抛弃界面.这删除的是一些健全性检查,因为该方法不关心你给它的对象类型:
public <E> E[]
getArray(Class<E> c, int size, int index)
{
...
现在您不必定义接口或实现它,只需调用:
Plane p[] = header.getArray(Plane.class, SIZE, LUMP_INDEX);
标签:java,deduplication,code-duplication 来源: https://codeday.me/bug/20190518/1128522.html