簡體   English   中英

對象引用Java

[英]Object References Java

我有對象引用的問題,這使我發瘋。 當我從一個對象獲取一個Integer []數組並修改此變量中的某些元素時,是否在不使用任何set方法的情況下也對該對象進行了修改是否正常? 例如,下面我想在本地修改時間表變量,而不是在bestSoFar對象中。 我怎樣才能做到這一點? 真正發生了什么?

for (IntTuple examRel: examsRel) 
{   
     int[] examsTogether = examRel.getData();
     double maxFitness = 0.0;
     Integer[] timetable = bestSoFar.getChromosome();

     for (int i=0; i < noOfTimeslots; i++)
     { 
          for (int j=0; j < examsTogether.length; j++)
          {
               timetable[examsTogether[j]] = i;
          }

          BestChromosome thisChromosome = evaluateChromosome(new BestChromosome(timetable));
          double thisFitness = thisChromosome.getFitness();

          if (thisFitness > maxFitness)
          {
              maxFitness = thisFitness;
              bestSoFar = thisChromosome;
          }
       }
    }
    return bestSoFar;
}

Java中的數組是一個對象,因此,在修改其元素時,指向該數組的所有引用的元素都會更改。 如果要本地副本,則應克隆它。 例如:

Integer[] origTimetable = bestSoFar.getChromosome();
Integer[] timetable = Arrays.copyOf (origTimetable, origTimeable.length);

是的,很正常。 該方法返回對對象中包含的數組的引用。 如果更改數組包含的內容,則會對數組進行修改。

您必須在返回數組之前制作該數組的防御性副本。

您可以通過使用List<Integer>來避免這些副本,並返回此列表的不可修改視圖以防止對其進行修改。 然后,如果需要修改列表,則將由調用方來創建列表的副本:

return Collections.unmodifiableList(list);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM