2015-02-09 151 views
0

用於LARG-DB基於動態多區域菜單中,我創建了一個類MenuPoint:如何在擴展類後擴展類數組/屬性類的數組屬性?

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];} 

和初始化它作爲我的主類的長度爲0的數組:MenuController
public MenuPoint [] menuItem = new MenuPoint[0];

我使用API​​調用通過初始化MenuController來獲取DB存儲的信息。

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; 
} 

addMenuItem:

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; 
} 

我發現菜單項dons't花費之後進行的任何屬性。

我是否必須創建MenuPoint的「新」實例才能使其工作? 甚至可以在不丟失屬性或值的情況下花費類數組嗎? 它很好用,因爲最後menuItem只是一個指針數組,指向多個工作存儲地址,不是嗎?

謝謝你們提供任何提示或更好的概念,你可以給我。 (我知道這個班級概念很愚蠢,但我不知道更好的) 請原諒我的壞語法。

+0

使用'List'。這些會在添加項目時自動調整大小。當您知道施工時物品的確切數量時,陣列可用於;即使這樣一個'List'通常更方便。 – 2015-02-09 08:35:22

+0

P.S.張貼之前請對您的問題進行拼寫檢查。 – 2015-02-09 08:36:21

+0

「我發現那menuItem ...」怎麼樣?你有一些代碼來演示它嗎? – laune 2015-02-09 08:41:17

回答

1

創建在方法addMenuItem然後將其與從現有的菜單項成員填充一個新的數組,但在指數(新)長度的元件 - 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 ? 
} 

的簡化versio但是,最重要的,不要使用List<MenuPoint>

+0

好的,謝里...... 我改正了它。 但是感謝各位^^ – xXTobiXx 2015-02-09 09:11:39

1

對於你的問題Do I have to create "new" Instances of MenuPoint to make it work?

Yes

從你需要初始化MenuPoint類對象的值存儲在陣列menuItem你的代碼片段的答案。
通過menuItem = (MenuPoint[]) newArray1;

複製你陣列沒有初始化有NullPointerException例外用於設置值設置爲空對象之後初始化您的數組元素與下面線

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

地點上面的行。

有一些更好的方法來維護使用ArrayList類的對象列表。

要使用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; 
    } 

我覺得這比使用反射與陣列容易。

+0

謝謝,詛咒我必須這樣做^^ 但是我認爲laune是正確的:) 我應該使用列表^^ – xXTobiXx 2015-02-09 09:07:09