【发布时间】:2011-10-27 13:34:30
【问题描述】:
我在处理大量二维坐标的代码中经常这样做:
int[] getSize() {
int[] res = {gridRows, gridColumns};
return res;
}
我知道我可以定义一个小类并获得类型安全,但我没有这样做,因为在我必须将其合并到我的代码中的自己的小 .java 文件中包含这样一个微不足道的类让我很恼火。
你认为这是丑陋的、坏的还是邪恶的?还是你也这样做?
【问题讨论】:
我在处理大量二维坐标的代码中经常这样做:
int[] getSize() {
int[] res = {gridRows, gridColumns};
return res;
}
我知道我可以定义一个小类并获得类型安全,但我没有这样做,因为在我必须将其合并到我的代码中的自己的小 .java 文件中包含这样一个微不足道的类让我很恼火。
你认为这是丑陋的、坏的还是邪恶的?还是你也这样做?
【问题讨论】:
如果您想要封装项目中的某个概念,例如,这两个 int 是坐标,那么为它们设置一个 Class 并没有错。在我看来,这要干净得多,然后强迫每个人都创建一个数组,等等。
例如,是否有其他人正在同一个项目中开发并调用您的方法,您认为他们获得一个具有两个位置的 int 数组还是一个名为 Coordinates 的对象更清楚?
此外,您可能希望实现诸如比较坐标之类的功能,如果您使用 Class,则可以将其封装为正确的 OO 方式。 (如果你重新定义了类似 equals 的东西,请记住尊重Object contract)。
【讨论】:
在这种情况下,您可以使用Point。
一般来说,抛开美学不谈,通常有足够多的琐碎辅助方法与此类相关,因此创建一个类来容纳它们是有意义的,而不是将逻辑分散在各处。有时,即使只是有一个好的 toString() 用于调试和日志记录也足够了。
如果需要考虑非常高的性能,请将高流量的琐碎辅助方法设为最终方法,以便内联它们。
潜在成员唯一的共同点是它们是由函数返回的,如果你能看到他们有更多共同点的未来,那么一定要创建一个类。
在某些情况下,考虑返回 void,并传入某种更大范围的上下文对象,该方法可以在该对象上设置返回值。这应该非常谨慎地使用 - 它很容易导致耦合蠕变。
【讨论】:
你可以将它定义为一个嵌套的静态类
更不用说该类将允许更多(例如在 1 个点定义 2D 坐标上的操作,将它们放在一个集合中(equals 不像在数组上那样工作))
【讨论】:
您可以创建一个内部类来保存方法的返回值。这样做的好处是不需要新的 .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)。如果该类不是“静态的”,那么如果没有外部类的实例,就无法创建它的新实例。
【讨论】:
不幸的是,在 java 中,这确实是返回多个值的最佳方式。我通常使用数组或列表。我不一定认为为它创建一个类本身就是“糟糕的形式”,但这是不必要的。
【讨论】:
鉴于 Java 不能从方法中返回多个值,您正在做的只是返回多个相同类型的值的唯一选择。如果值来自不同的类型,则必须编写一个小类(某种值对象)来封装返回值。
还有一个,甚至是最丑陋的选择,就是将数组作为参数传递,然后将返回值留在那里——这是一种在 Java 中模拟传递引用的技巧。非常气馁。
【讨论】: