【问题标题】:Java: returning two ints from a method callJava:从方法调用中返回两个整数
【发布时间】:2011-10-27 13:34:30
【问题描述】:

我在处理大量二维坐标的代码中经常这样做:

int[] getSize() {
    int[] res = {gridRows, gridColumns};
    return res;
}

我知道我可以定义一个小类并获得类型安全,但我没有这样做,因为在我必须将其合并到我的代码中的自己的小 .java 文件中包含这样一个微不足道的类让我很恼火。

你认为这是丑陋的、坏的还是邪恶的?还是你也这样做?

【问题讨论】:

    标签: java class methods


    【解决方案1】:

    如果您想要封装项目中的某个概念,例如,这两个 int 是坐标,那么为它们设置一个 Class 并没有错。在我看来,这要干净得多,然后强迫每个人都创建一个数组,等等。

    例如,是否有其他人正在同一个项目中开发并调用您的方法,您认为他们获得一个具有两个位置的 int 数组还是一个名为 Coordinates 的对象更清楚?

    此外,您可能希望实现诸如比较坐标之类的功能,如果您使用 Class,则可以将其封装为正确的 OO 方式。 (如果你重新定义了类似 equals 的东西,请记住尊重Object contract)。

    【讨论】:

      【解决方案2】:

      在这种情况下,您可以使用Point

      一般来说,抛开美学不谈,通常有足够多的琐碎辅助方法与此类相关,因此创建一个类来容纳它们是有意义的,而不是将逻辑分散在各处。有时,即使只是有一个好的 toString() 用于调试和日志记录也足够了。

      如果需要考虑非常高的性能,请将高流量的琐碎辅助方法设为最终方法,以便内联它们。

      潜在成员唯一的共同点是它们是由函数返回的,如果你能看到他们有更多共同点的未来,那么一定要创建一个类。

      在某些情况下,考虑返回 void,并传入某种更大范围的上下文对象,该方法可以在该对象上设置返回值。这应该非常谨慎地使用 - 它很容易导致耦合蠕变。

      【讨论】:

        【解决方案3】:

        你可以将它定义为一个嵌套的静态类

        更不用说该类将允许更多(例如在 1 个点定义 2D 坐标上的操作,将它们放在一个集合中(equals 不像在数组上那样工作))

        【讨论】:

          【解决方案4】:

          您可以创建一个内部类来保存方法的返回值。这样做的好处是不需要新的 .java 文件:

          public class Parent{
            public Size getSize() {
              return new Size(gridRows, gridColumns);
            }
          
            public static class Size{
              //...
            }
          }
          
          Parent parent = new Parent();
          Parent.Size size = parent.getSize();
          

          将类定义为“静态”基本上意味着它可以像普通类一样对待(除非你必须使用Parent.Size 而不是Size)。如果该类不是“静态的”,那么如果没有外部类的实例,就无法创建它的新实例。

          【讨论】:

            【解决方案5】:

            不幸的是,在 java 中,这确实是返回多个值的最佳方式。我通常使用数组或列表。我不一定认为为它创建一个类本身就是“糟糕的形式”,但这是不必要的。

            【讨论】:

              【解决方案6】:

              鉴于 Java 不能从方法中返回多个值,您正在做的只是返回多个相同类型的值的唯一选择。如果值来自不同的类型,则必须编写一个小类(某种值对象)来封装返回值。

              还有一个,甚至是最丑陋的选择,就是将数组作为参数传递,然后将返回值留在那里——这是一种在 Java 中模拟传递引用的技巧。非常气馁。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-01-26
                • 2013-11-03
                • 2021-12-28
                • 1970-01-01
                • 1970-01-01
                • 2011-09-14
                • 1970-01-01
                • 2014-11-10
                相关资源
                最近更新 更多