【问题标题】:is there a way to minimize the lines for this有没有办法最小化这个线
【发布时间】:2017-03-29 03:43:26
【问题描述】:

有没有办法尽量减少代码行数来实现同样的事情

    L1.setFont(new Font("Serief", Font.BOLD, 24));
    L2.setFont(new Font("Serief", Font.BOLD, 24));
    L3.setFont(new Font("Serief", Font.BOLD, 24));
    L4.setFont(new Font("Serief", Font.BOLD, 24));
    L5.setFont(new Font("Serief", Font.BOLD, 24));
    L6.setFont(new Font("Serief", Font.BOLD, 24));
    L7.setFont(new Font("Serief", Font.BOLD, 24));
    L8.setFont(new Font("Serief", Font.BOLD, 24));

【问题讨论】:

  • 将它分组到List 中怎么样? for(WhateverThisClassIs item : whateverThisClassIslist) {item.setFont(...); ?
  • 不是 Serif 而不是 Serief?
  • 为什么?在这种情况下,更重要的是只创建一个 Font 对象而不是八个(并且还要正确拼写“Serif”)。
  • 旁注:阅读 java 命名约定。字段/变量名称采用 camelCase;更糟糕的是:通过将自己限制为单个字符名称来节省“打字工作量”绝对没有意义!
  • 这个问题似乎属于codereview.stackexchange.com

标签: java


【解决方案1】:

你可以的

Font serif = new Font("Serif ", Font.BOLD, 24);
for (JLabel l : new JLabel[] { L1, L2, L3, L4, L5, L6, L7, L8 })
    l.setFont(serif);

在 Java 8 中你可以编写

Stream.of(L1, L2, L3, L4, L5, L6, L7, L8).forEach(l -> l.setFont(serif));

【讨论】:

    【解决方案2】:

    其他答案都是正确的,但它们将您的设计问题视为给定的。简单地说:我认为这是错误的。

    关键是:一旦你开始命名变量,如 L1、L2、L3 ……你就做错了非常。尤其是当您的下一个想法是编写处理 L1 的特定代码和处理 L2 的代码时;等等。也许其他答案可以帮助您修复代码的 this 部分。但迟早,你会有无数的缺陷代码;所有人都以自己的方式与那些 Lx 家伙打交道。或者在这个程序中甚至可能没有那些标签。但是在其他一些代码中,您开始时会犯同样的错误,即以低效的方式组织 (UI) 元素。

    这里真正的解决方案:你应该使用某种收集机制;要么是List;或者也许是一个普通的旧数组。因为这样您就可以迭代该集合,并且只需一行行代码来以相同的方式设置该集合中的所有元素。

    或者反过来:你查询包含所有元素标签的面板;如果一个元素匹配某个条件,那么您可以根据需要更新其属性。如果您遵循该路径,您甚至可能不必在“自己的代码”中保留对元素的任何引用;您只需使用已经存在的手段;并且可以像this 一样简单。

    我的意思是:其他解决方案中的所有好主意,但我认为它们走向了错误的方向。他们试图用好主意来修复损坏的方法。跟随一个现在非常有名的内存:将这些 UI 元素视为 cattle,而不是 pets。含义:对您来说,它们只是您组织的“数字”,以便可以作为一个整体以有效的方式访问它们(相对于被视为个体的宠物,具有一个名字,并且大多数时候被称为“单一实体”)。

    但只是添加我的简短版本;彼得解决方案的轻微变化:

    for (JLabel l : Arrays.asList( L1, L2, L3, L4, L5, L6, L7, L8 ))
    

    也可以。

    【讨论】:

      【解决方案3】:

      是的,创建一个名为 setFont(Object... values) 的方法并传递您需要设置字体的任意数量的对象。 下面给出了 JLabel 对象的示例。

      void setFont(JLabel... jLabels){
          for(JLabel jLabel : jLabels){
              jLabel.setFont(new Font("Serif", Font.BOLD, 24));
          }
      }
      

      你可以这样称呼它

      setFont(L1,L2,L3,L4); //any number of arguments
      

      【讨论】:

        【解决方案4】:

        把它缩小到... 4 行 ;-)

        setFont(new Font("Serief", Font.BOLD, 24), L1, L2, L3, L4, L5, L6, L7, L8);
        
        private void setFont(Font font, Object... objects){
            for(Object object : objects){
                object.setFont(font);
            }
        }
        

        正如 Hulk 在 cmets 中所指出的,您应该将 Object 替换为您调用 setFont 的任何类。

        请记住,每当您看到重复代码时,您通常可以将其替换为方法调用。以下是关于为什么重复代码不好的更多信息:https://en.wikipedia.org/wiki/Duplicate_code

        【讨论】:

        • 当然,Object 必须替换为实际上具有 setFont 方法的类型才能进行编译 - 可能值得更改为其他内容以避免初学者混淆。
        猜你喜欢
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多