编程语言
首页 > 编程语言> > 重复此java代码重复

重复此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