繁体   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