簡體   English   中英

關於用循環構造的東西的Java mutator方法

[英]Java mutator method on something that was constructed with a loop

所以我有一個用循環構造的類。 在構造函數中,我有兩個while循環,它們構成了圓圈的“網格”。 它應該是一個圍巾上課,但我稱之為鏈甲,因為這聽起來更酷。 無論如何,我們應該能夠用不同的(客戶)類改變圍巾的顏色。 我顯然需要添加一個mutator方法來改變顏色。 幸運的是,在objectdraw中有一個名為setColor()的mutator。 它工作正常,除非我嘗試將其添加到此類時它只更改網格中的最后一個圓。 我知道為什么會這樣,但我不知道如何解決它。 我已經評論過我們在課堂上一直使用的“典型”變種器。

編輯:抱歉困惑的人...這只是類,我有一個客戶端調用一個新的ChainMail(),然后對它做一個.setColor()但它只更改最后一個framedoval而不是所有這些。 那就是問題所在

import objectdraw.*;
import java.awt.*;

public class ChainMail {

  private FramedOval link;

  public ChainMail(int rows,int links,
                   Location p,Color rgb,
                   DrawingCanvas c) {

    double numRows = 0;

    // create the number of rows specified
    while (numRows < rows) {

      double numLinks = 0;

      // create the number of links specified
      while (numLinks < links) {
        link = new FramedOval(p,12,12,c);
        link.setColor(rgb);

        // update the position
        p.translate(8,0);
        numLinks++;
      }

      // move position back to front col and down one row
      p.translate(-8*links,8);
      numRows++;

    }

  }

  public ChainMail(int rows,int links,Location p,DrawingCanvas c) {
    this(rows,links,p,Color.BLACK,c);
  }

  /* this doesn't work, only changes last circle
   * public void setColor(Color c) {
   *   link.setColor(c);
   * }
   */

}

如果你把它移到class(如注釋代碼中所示)那么你從哪里調用這個函數? 我認為這是有所作為的。 假設您正在執行以下操作:

  1. 刪除“link.setColor(rgb);” 來自while循環
  2. 取消注釋public void setColor(Color c)函數
  3. 創建ChainMail的實例(比如myChainMail)
  4. 調用myChainMail.setColor(c)

此方案將給出您已報告的結果,即僅最后圈出的顏色。 有兩種方法可以解決這個問題:

  1. 首先是你已經在做的事情
  2. 而不是“私人FramedOval鏈接;” 創建“private ArrayList linkList = new ArrayList;現在在創建類型為FramedOval的鏈接變量之前。然后在你做link = new FramedOval(p,12,12,c)之后;在while循環中將此添加到上面創建的ArrayList。現在在setColor中您的類的方法迭代arraylist中的所有項目並在這些項目上設置顏色

我說你扔掉它們因為你這樣做:

  while (numLinks < links) {
    link = new FramedOval(p,12,12,c);
    link.setColor(rgb);

    // update the position
    p.translate(8,0);
    numLinks++;
  }

但是你在哪里用你創建的FramedOval做任何事情? 每次你創建一個新的FramedOval對象並有鏈接引用它時,先前的引用會丟失並且可能是垃圾收集; 它被丟棄了,沒有意義。

通常你會這樣做:

  List<FramedOval> framedOvalList = new LinkedList<FramedOval>(); // or ArrayList
  while (numLinks < links) {
    link = new FramedOval(p,12,12,c);
    link.setColor(rgb);

    // *** here add the created object to some collection
    framedOvalList.add(link);

    // update the position
    p.translate(8,0);
    numLinks++;
  }

但是我沒有看到你做任何類似的事情。

暫無
暫無

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

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