如何在扩展 class 后扩展 class 数组/调用 class 数组属性?

How to extend a class array/ call class array attributes after extend a class?

对于基于大型数据库的动态多区域菜单,我创建了一个 class 菜单点:

class MenuPoint{
public int areaId;

public int preID;

public String name;
public String desc;

public String stepInImg = "bsp.img";
public String stepOutImg = "bsp.img";

public String detailedForm = "bsp.fxml";
public String detailedImg = "bsp.img";

public String [] additionalOptionForm = new String[0];
public String [] additionalOptionName = new String[0];
public String [] additionalOptionImg = new String[0];}

并在我的主 class 中将其初始化为 0 长度数组:MenuController
public MenuPoint [] menuItem = new MenuPoint[0];

我使用 API 调用通过初始化 MenuController 获取我的数据库存储信息。 我使用以下代码存储结果:

int dataStructlength = 12;
    String[] exampleApiResultKeys = new String[dataStructlength];
    exampleApiResultKeys[0] = "SITE_NUMBER";
    exampleApiResultKeys[1] = "SITE_DESC";
    exampleApiResultKeys[2] = "SITE_NUMBER_EXT";
    exampleApiResultKeys[3] = "CELL_NUMBER";
    exampleApiResultKeys[4] = "CELL_DESC";
    exampleApiResultKeys[5] = "CELL_TYPE";
    exampleApiResultKeys[6] = "MACHINE_GROUP_NUMBER";
    exampleApiResultKeys[7] = "MACHINE_GROUP_DESC";
    exampleApiResultKeys[8] = "MACHINE_GROUP_TYPE";
    exampleApiResultKeys[9] = "STATION_NUMBER";
    exampleApiResultKeys[10] = "STATION_DESC";
    exampleApiResultKeys[11] = "STATION_TYPE";

    exampleApiController.test_mdataGetMachineAssetStructure(exampleApiFilter, exampleApiResultKeys);

    for(int i = 0; exampleApiController.resultValues.value != null && i < exampleApiController.resultValues.value.length/12; i++)
    {
        boolean isUseless = false;
        for(int a = 0; a < dataStructlength; a ++)
            if(true == exampleApiController.resultValues.value[i*dataStructlength+a].trim().isEmpty())
                isUseless = true;

        if(!isUseless)
        {
        int preId= -1;
        if("M".equals(exampleApiController.resultValues.value[i*12+5]))
        {
            if(giveItemId(0, preId, exampleApiController.resultValues.value[i*12]) >= 0)
                preId = giveItemId(0, preId, exampleApiController.resultValues.value[i*12]);
            else
                preId = addMenuItem(0, preId, exampleApiController.resultValues.value[i*12], exampleApiController.resultValues.value[i*12+1], "bsp.form");
        }
        if("M".equals(exampleApiController.resultValues.value[i*12+5]))
        {
            if(giveItemId(1, preId, exampleApiController.resultValues.value[i*12+3]) >= 0)
                preId = giveItemId(0, preId, exampleApiController.resultValues.value[i*12+3]);
            else
                preId = addMenuItem(1, preId, exampleApiController.resultValues.value[i*12+3], exampleApiController.resultValues.value[i*12+4], "bsp.form");
        }
        if("M".equals(exampleApiController.resultValues.value[i*12+8]))
        {
            if(giveItemId(2, preId, exampleApiController.resultValues.value[i*12+6]) >= 0)
                preId = giveItemId(0, preId, exampleApiController.resultValues.value[i*12+6]);
            else
                preId = addMenuItem(2, preId, exampleApiController.resultValues.value[i*12+6], exampleApiController.resultValues.value[i*12+7], "bsp.form");
        }
        if("M".equals(exampleApiController.resultValues.value[i*12+11]))
        {
            if(giveItemId(3, preId, exampleApiController.resultValues.value[i*12+9]) >= 0)
                preId = giveItemId(0, preId, exampleApiController.resultValues.value[i*12+9]);
            else
                preId = addMenuItem(3, preId, exampleApiController.resultValues.value[i*12+9], exampleApiController.resultValues.value[i*12+10], "bsp.form");
        }
        }

giveItemId:

public int giveItemId(int areaId_temp, int preId_temp, String name_temp)
{
    for(int i = 0; i < menuItem.length; i++)
    {
        if(menuItem[i].areaId == areaId_temp && menuItem[i].name.equals(name_temp) &&  menuItem[i].preID == preId_temp)
            return i;
    }
    return -1;
}

添加菜单项:

public int addMenuItem(int areaId_temp, int preId_temp, String name_temp, String desc_temp, String form_temp)
{
    Object newArray1 = Array.newInstance(menuItem.getClass().getComponentType(), Array.getLength(menuItem)+1);  // +1 Arrayfeld
    System.arraycopy(menuItem, 0, newArray1, 0, Array.getLength(menuItem));
    menuItem = (MenuPoint[]) newArray1; // expend but missing attributes

    menuItem[menuItem.length-1].areaId = areaId_temp;
    menuItem[menuItem.length-1].preID = preId_temp;
    menuItem[menuItem.length-1].name = name_temp;
    menuItem[menuItem.length-1].desc = desc_temp;
    menuItem[menuItem.length-1].detailedForm = form_temp;
    return menuItem.length-1;
}

我发现 menuItem 展开后没有任何属性。

我是否必须创建 "new" 个 MenuPoint 实例才能使其工作? 甚至可以在不丢失属性或它们的值的情况下扩展 class 数组吗? 它应该,因为最后 menuItem 只是一个指针数组,指向多个工作存储地址,不是吗?

感谢你们给我的任何提示或更好的概念。 (我知道这个 class-概念很愚蠢,但我不知道更好的概念) 请原谅我的语法错误。

您在 addMenuItem 方法中创建了一个新数组,然后用现有 menuItem 中的成员填充该数组,但索引(新)长度为 1 的元素未初始化:

menuItem[menuItem.length-1] = new MenuPoint();

您应该在尝试设置字段时收到 NullPointerException。

java.lang.reflect.Array 的所有这些用法都相当做作。有更简单的方法可以实现这一点。这是 addMenuItem

的简化版本
public int addMenuItem(int areaId, String name){
    MenuPoint[] newMenuItem = new MenuPoint[menuItem.length + 1];
    System.arraycopy(menuItem, 0, newMenuITem, 0, menuItem.length);
    menuItem = newMenuItem;
    menuItem[menuItem.length-1] = new MenuPoint();
    menuItem[menuItem.length-1].areaId = areaId;
    menuItem[menuItem.length-1].name = name;
    return menuItem.length; // Why -1 ? 
}

但是,最重要的是,一定要使用 List<MenuPoint>

回答你的问题Do I have to create "new" Instances of MenuPoint to make it work?

Yes

根据您的代码片段,您需要初始化 MenuPoint class 对象以将其值存储到数组 menuItem.
使用下面的行

初始化您的数组元素
menuItem[menuItem.length-1] = new MenuPoint();

通过 menuItem = (MenuPoint[]) newArray1;

复制数组后放在行上方

如果没有初始化,将值设置为空对象存在 NullPointerException 异常。

有一些更好的方法可以使用 ArrayList class 来维护对象列表。

要使用 ArrayList,您需要更改以下代码

public List<MenuPoint> menuItem = new ArrayList<MenuPoint>; //Initialize list    

您的函数将是

public int addMenuItem(int areaId_temp, int preId_temp, String name_temp, String desc_temp, String form_temp)
    {
        MenuPoint menuPoint = new MenuPoint();

        menuPoint.areaId = areaId_temp;
        menuPoint.preID = preId_temp;
        menuPoint.name = name_temp;
        menuPoint.desc = desc_temp;
        menuPoint.detailedForm = form_temp;
        menuItem.add(menuPoint);

        return menuItem.size()-1;
    }

我认为这比对数组使用反射更容易。