当前位置: 首页 > 面试题库 >

声明单个对象或将匿名对象循环到ArrayList中是更​​好的做法吗?

谢鸿飞
2023-03-14
问题内容

我正在通过一本教科书学习Java编程。编程练习要求您:

(摆动通用功能)显示包含六个标签的框架。将标签的背景设置为白色。将标签的前景分别设置为黑色,蓝色,青色,绿色,洋红色和橙色,如图12.28a所示。将每个标签的边框设置为黄色的线条边框。将每个标签的字体设置为Times
Roman,粗体和20像素。将每个标签的文本和工具提示文本设置为其前景色的名称。

我对这个问题有两个答案。我的答案和书的答案。这两个答案都很好。

我使用一个Array并通过循环使用匿名对象填充它(如类Sixlabels扩展JFrame {}中所示):

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;


public class TWELVE_point_8 {

public static void main(String[] args) {

    JFrame frame = new SixLabels();
    frame.setTitle("Six Labels");
    frame.setSize(300, 200);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}

}

class SixLabels extends JFrame {

public SixLabels() {
    setLayout(new GridLayout(2, 3));

    JLabel[] list = {
        new JLabel("Black"),
        new JLabel("Blue"),
        new JLabel("Cyan"),
        new JLabel("Green"),
        new JLabel("Magenta"),
        new JLabel("Orange")};

     // set foreground colors
    list[0].setForeground(Color.black);
    list[1].setForeground(Color.blue);
    list[2].setForeground(Color.cyan);
    list[3].setForeground(Color.green);
    list[4].setForeground(Color.magenta);
    list[5].setForeground(Color.orange);

    // set background colors
    for (int i = 0; i < list.length; i++)
        list[i].setBackground(Color.white);

    // set fonts
    Font font = new Font("TimesRoman", Font.BOLD, 20);

    for (int i = 0; i < list.length; i++)
        list[i].setFont(font);

    // set borders
    Border lineBorder = new LineBorder(Color.yellow, 1);

    for (int i = 0; i < list.length; i++)
         list[i].setBorder(lineBorder);

    // set tooltip
    for (int i = 0; i < list.length; i++)
            list[i].setToolTipText(list[i].getText());

    // add all labels to container
    for (int i = 0; i < list.length; i++)
        add(list[i]);

}
}

并且书中的答案不使用数组列表(如公共Exercise12_8中扩展JFrame {}所示);:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class Exercise12_8 extends JFrame {
      private JLabel jlblBlack = new JLabel("black");
      private JLabel jlblBlue = new JLabel("blue");
      private JLabel jlblCyan = new JLabel("cyan");
      private JLabel jlblGreen = new JLabel("green");
      private JLabel jlblMagenta = new JLabel("magenta");
      private JLabel jlblOrange = new JLabel("orange");

      public Exercise12_8() {
          setLayout(new GridLayout(2, 3));
          this.add(jlblBlack);
          this.add(jlblBlue);
          this.add(jlblCyan);
          this.add(jlblGreen);
          this.add(jlblMagenta);
          this.add(jlblOrange);

          jlblBlack.setBackground(Color.WHITE);
          jlblBlue.setBackground(Color.WHITE);
          jlblCyan.setBackground(Color.WHITE);
          jlblGreen.setBackground(Color.WHITE);
          jlblMagenta.setBackground(Color.WHITE);
          jlblOrange.setBackground(Color.WHITE);

          jlblBlack.setForeground(Color.BLACK);
          jlblBlue.setForeground(Color.BLUE);
          jlblCyan.setForeground(Color.CYAN);
          jlblGreen.setForeground(Color.GREEN);
          jlblMagenta.setForeground(Color.MAGENTA);
          jlblOrange.setForeground(Color.ORANGE);

          Font font = new Font("TImesRoman", Font.BOLD, 20);
          jlblBlack.setFont(font);
          jlblBlue.setFont(font);
          jlblCyan.setFont(font);
          jlblGreen.setFont(font);
          jlblMagenta.setFont(font);
          jlblOrange.setFont(font);

          Border border = new LineBorder(Color.YELLOW);
          jlblBlack.setBorder(border);
          jlblBlue.setBorder(border);
          jlblCyan.setBorder(border);
          jlblGreen.setBorder(border);
          jlblMagenta.setBorder(border);
          jlblOrange.setBorder(border);

          jlblBlack.setToolTipText("black");
          jlblBlue.setToolTipText("blue");
          jlblCyan.setToolTipText("cyan");
          jlblGreen.setToolTipText("green");
          jlblMagenta.setToolTipText("magenta");
          jlblOrange.setToolTipText("orange");
      }

      public static void main(String[] args) {
          Exercise12_8 frame = new Exercise12_8();
          frame.setTitle("Exercise12_8");
          frame.setSize(400, 400);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setLocationRelativeTo(null); // Center the frame
          frame.setVisible(true);
     }
}

我的问题是:是否最好单独声明JLabel对象(就像本书一样),或者像我一样匿名填充Array(或ArrayList)?我在本书中所看到的唯一好处是可读性强,并具有一个变量名(可以在以后的程序中使用,但不适用于该特定程序)。


问题答案:

我可以为您提供第三个答案。创建一个采用的方法JLabel并对其进行配置。这样,您可以使用其他两种方法之一,并降低代码复杂度。

答案是,这取决于。这取决于您要实现的目标。

如果您要进行大量更改(例如对您在这里的组件)反复进行相同的操作,那么我可能会想使用简单List或数组。如果元素的数量是动态的,或者只能在类内部访问,则这特别有用。

另一方面,如果您想从外部更改或更新组件的状态,则通常更容易提供对组件的命名访问。是的,您可以提供一种使用int参数的方法,但随后您就遇到了始终必须验证参数的问题:P

所以我想,问题是,您需要实现什么?



 类似资料:
  • 问题内容: 以下代码段是否会降低性能? 还是这段代码实际上更有意义? 如果在字节码中这两个完全相等,那么显然第一种方法在样式方面看起来更好,但我想确保确实如此。 问题答案: 在当今的编译器中,没有。我在最小范围内声明对象,因为对于下一个家伙而言,它更具可读性。

  • 我有一个非常具体的问题,我在网上任何地方都找不到答案。我不熟悉python代码(C是我的第一语言),所以我假设这只是一个语义问题。我的问题是关于在for循环范围内声明的对象。 这段代码的目标是在for循环中创建一个新的临时对象,向其列表中添加一些项,然后将该对象放入for循环之外的列表中。在for循环的每次迭代中,我希望创建一个新的、分离的对象来填充项目。但是,每次执行for循环时,对象的列表中已

  • 问题内容: 我想在完成后从中删除对象,但找不到解决方法。尝试像下面的示例代码中那样将其删除不会起作用。如何在此循环中访问当前对象的迭代器以将其删除? 问题答案: 您不能在增强的for循环内。您必须使用“长手”方法: 当然,并非所有的迭代器都 支持 删除,但是您可以使用。 另一种方法是建立一个额外的“要删除的像素”集合,然后在列表最后调用。

  • 经过前面的学习,我们知道创建对象的标准格式如下: 类名称 对象名 = new 类名称(); 每次 new 都相当于开辟了一个新的对象,并开辟了一个新的物理内存空间。如果一个对象只需要使用唯一的一次,就可以使用匿名对象,匿名对象还可以作为实际参数传递。 匿名对象就是没有明确的给出名字的对象,是对象的一种简写形式。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。 程序运

  • 更新:每个类的用途取决于哪种应用程序,但这些类可能被放置在应用程序的不同层中。 例如: 数据从数据库(数据库实体)到HTML表单(模型/视图模型)的数据 REST API结果到数据库的数据 null 当然,一个具有类似特性的库是有意的,但是Kotlin特性的信息也是受欢迎的(比如在ECMAScript中传播)。