【问题标题】:Java mutator method on something that was constructed with a loop用循环构造的东西上的 Java mutator 方法
【发布时间】:2011-10-13 02:03:16
【问题描述】:

所以我有一个用循环构造的类。在构造函数中,我有两个 while 循环,它们构成了圆圈的“网格”。它应该是上课用的围巾,但我称它为锁子甲,因为这听起来更酷。无论如何,我们应该能够用不同的(客户端)类来改变围巾的颜色。我显然需要添加一个 mutator 方法来改变颜色。幸运的是,在 objectdraw 中有一个称为 setColor() 的 mutator。它工作得很好,除了当我尝试将它添加到这个类时,它只会改变网格中的最后一个圆圈。我知道为什么会发生这种情况,但我不知道如何解决它。我已经注释掉了我们在课堂上使用的“典型”突变体。

编辑:抱歉让大家感到困惑...这只是课程,我有一个客户端调用 new 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);
   * }
   */

}

【问题讨论】:

  • 你在哪里添加链接?您似乎在 while 循环中创建了一个 FramedOval,但随后似乎没有对它做任何事情,就好像您只是丢弃它一样。
  • 编辑以更好地代表问题
  • 不幸的是,您的编辑没有澄清任何问题。再一次,您创建 FramedOval 对象,再一次,您似乎对它们什么也不做。您在哪里将它们添加到集合、数组、GUI、anything
  • 你把它们扔掉了,你知道的。
  • 我不会把它们扔掉.....这个类是一个构造函数,它定义了对象链邮件。然后在我的客户端中,我使用正确的参数调用 new ChainMail(),它会按照我想要的方式在网格中绘制 framedovals ......我不明白你在说什么,我要把它们扔掉......

标签: java while-loop mutators


【解决方案1】:

如果你把它移到类中(如注释代码所示)那么你从哪里调用这个函数?我认为这就是与众不同的原因。假设您正在执行以下操作:

  1. 删除“link.setColor(rgb);”从while循环内部
  2. 取消注释 public void setColor(Color c) 函数
  3. 创建 ChainMail 实例(比如 myChainMail)
  4. 调用 myChainMail.setColor(c)

此方案将给出您报告的结果,即只有最后一个圈出的结果是彩色的。 有两种方法可以解决这个问题:

  1. 首先是您已经在做的事情
  2. 而不是“私有 FramedOval 链接;” create "private ArrayList linkList = new ArrayList; 现在在 while 创建 FramedOval 类型的链接变量之前。然后在执行 link = new FramedOval(p,12,12,c); 在 while 循环中将其添加到上面创建的 ArrayList 中。 现在在你的类的 setColor 方法中遍历 arraylist 中的所有项目并为这些项目设置颜色

【讨论】:

  • 是的.... 班上有很多 Java 经验的其他人提到了 arrayLists,但我们以前从未使用过它们,所以我认为老师正在寻找另一种方法来做到这一点为。
  • 如果您想在单独的函数中调用所有这些实例的任何方法,除了存储对 FramedOval 实例的引用之外别无他法
  • 当然,还有很多其他方法来存储引用,如果您事先知道将存储多少项目,则可以使用数组、LinkedList 或 Maps、Sets 等,一切都取决于需要.我还建议您不要调用您的 ArrayList 链接列表,因为这非常令人困惑,并且表明它实际上是 LinkedList 而不是 ArrayList。
  • 我称它为linkList,因为它是一个链接列表。但是我同意这个名称会混淆,因为它与标准 DS LinkedList 冲突。您可以使用不同的变量名称,例如 listOfLinks 并使用 ArrayList 或 LinkedList 作为 DS 来存储对 FramedOval 实例的引用
【解决方案2】:

我说你把它们扔掉是因为你这样做:

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

但我没有看到你做任何类似的事情。

【讨论】:

  • 好吧,我误会了你说的我要扔掉的东西。你说我正在丢弃每个链接,你是对的,我正在这样做。我们还没有学到任何关于数组或数组列表的知识,所以我认为还有另一种方法。作业到期前的最后一节课是今天,所以如果我们不讨论其他修复,我可能最终会做这样的事情。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多