这个问题可能有点主观,但我只是想按照最好的编程方法来组织代码。
我有一个类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
是使用它们的原因,因此将它们存储在类中会将其本地化到它将要使用的位置。这也意味着可以将其更改为private,以便仅在一个类中使用。
另一方面,如果它是在Rational
内定义的,那么对值的所有调用都会变为Rational.ZERO
,Rational.ONE
,Rational.NEG_ONE
- 这使得它非常人类可读的,并以词汇可理解的方式组织它。它还提供了在Polynomial
中定义类似常量的机会,如果需要的话。
基本上,除了意见之外,在这样的事情中组织最常见的做法是什么?我的想法是适合它的任何一个位置,还是有其他解决方案我没有考虑过?
答案 0 :(得分: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);
答案 1 :(得分:0)
另一个建议 - 你可以像Java一样做类似的事情,就是重用现有的实例。
所以你可以给Rational私有构造函数,它可以阻止其他类创建它的直接实例,并引入一个公共的静态工厂方法,例如: “Rational.get(1)”或“Rational.of(1)”。
这样,您可以保留一些流行的数字,例如您在静态字段中提到的数字,并返回它们而不是创建新实例。您甚至可以考虑保留一个(有限的)池,以便在大量Rational重复使用的情况下进一步提高性能。
这个解决方案的一大优点是新开发人员,不了解你引入的常量,不会错误地使用“Rational(1)”,因为每个人都被迫使用工厂方法。
当然,使用这种方法,您还应该确保Rational类是不可变的!