5

这个问题可能有点主观,但我只是想遵循代码组织的最佳编程实践。

我有一个对类Polynomial进行大量引用的类Rational,并且在许多不同的方法中,它使用一个Rational等于 1、0 或 -1 的值进行比较。

因此,我定义了以下常量:

public static final Rational ZERO    = new Rational(0);
public static final Rational ONE     = new Rational(1);
public static final Rational NEG_ONE = new Rational(-1);

但是,我不确定的是以有意义的方式存储这些值的位置。

一方面,Polynomial是什么使用它们,因此将它们存储在类中会将其本地化到将要使用的位置。这也意味着可以将其更改为私有,以便仅在一个类中使用。

另一方面,如果它是在 内部定义的Rational,那么对值的所有调用都变为Rational.ZERO, Rational.ONE, Rational.NEG_ONE-- 这使得它非常易于阅读,并以词汇上易于理解的方式组织它。如果需要,它还提供了定义类似常量的机会Polynomial

所以基本上,撇开意见不谈,在这种情况下,组织最常见的做法是什么?我的想法是否适合它的任何一个位置,或者是否有其他我没有考虑过的解决方案?

4

2 回答 2

9

它们应该在Rational课堂上,因为它们是有理数的抽象。如果您想将它们转移到一个RationalPolynomial班级,这将是有争议的,但即便如此,我相信保留它们Rational会更好。

这样做的一个重要要求是让你的Rational类不可变;否则你不应该将它们公开。有效的 Java 在第 76 页提到:

不可变类应该通过鼓励客户尽可能重用现有实例来利用这一点。一种简单的方法是为常用值提供公共静态最终常量。例如,Complex 类可能提供以下常量:

public static final Complex ZERO = new Complex(0, 0);
public static final Complex ONE = new Complex(1, 0);
public static final Complex I = new Complex(0, 1);
于 2013-11-03T18:56:30.007 回答
0

另一个建议 - 你可以做一些类似于 Java 对 Strings 所做的事情,即重用现有实例。

因此,您可以给 Rational 私有构造函数,以防止其他类创建它的直接实例,并引入公共静态工厂方法,例如“Rational.get(1)”或“Rational.of(1)”。

这样,您可以保留一些流行的数字,例如您在静态字段中提到的数字并返回它们而不是创建新实例。您甚至可以考虑保留一个(有限的)池,以防更多的 Rational 被一遍又一遍地重用,从而进一步提高性能。

这个解决方案的最大优点是,不了解您介绍的常量的新开发人员不会错误地使用“Rational(1)”,因为每个人都被迫使用工厂方法。

当然,使用这种方法,您还应该确保 Rational 类是不可变的!

于 2013-12-11T10:14:35.333 回答