Java代码组织:在哪里保留静态类的实例

时间:2013-11-03 18:49:41

标签: java organization code-organization

这个问题可能有点主观,但我只是想按照最好的编程方法来组织代码。

我有一个类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.ZERORational.ONERational.NEG_ONE - 这使得它非常人类可读的,并以词汇可理解的方式组织它。它还提供了在Polynomial中定义类似常量的机会,如果需要的话。

基本上,除了意见之外,在这样的事情中组织最常见的做法是什么?我的想法是适合它的任何一个位置,还是有其他解决方案我没有考虑过?

2 个答案:

答案 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类是不可变的!