如何在Java中构造一组类中的对象

时间:2014-08-06 20:59:59

标签: java

所以,因为我正在推动我有限的Java知识的发展。我想在一个类中有一个对象数组。我认为这是子类,但这不是我想要的。我不知道我想要什么。这是java docs示例。

public class Bicycle {

    // the Bicycle class has three fields
    public int cadence;
    public int gear;
    public int speed;

    // the Bicycle class has one constructor
    public Bicycle(int startCadence, int startSpeed, int startGear) {
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;
    }

    // the Bicycle class has four methods (getters/setters removed)

    // here is my new thought - not sure if its right
           public class DriveChain {
              public int big-chainring
              public int little-chainring
              public int chain 
        // and getters and setters
           }
    // here i want to create an array of this.
    ArrayList<DriveChain> dcArray ;

    // here i can add to the array
        public void addDriveChain(drivechain dc) {
            this.dcArray.add(dc);
        } 
}

我想在此类中添加带getter和setter的字段,并将其视为数组列表。例如如上所述。希望我有意义。

2 个答案:

答案 0 :(得分:2)

我不明白为什么你不会将DriveChain放在自己的档案中。如果将其保留为Bicycle中的嵌套类,请确保它是static类,以避免捕获封闭的实例。

除此之外,你的方法是有道理的,只需使用这个小小的改变:

private final List<DriveChain> driveChains = new ArrayList<>();
  • 集合应该主要是final并初始化为空集合,因为它们无论如何都是可变的,但这消除了NullPointerException;

  • 的危险
  • 使用List作为变量类型,而不是ArrayList(对接口进行编程而不是实现);

  • 不要使用&#34; array&#34;作为变量名称的一部分,因为它不是数组。使用dcList或,像我一样driveChains

答案 1 :(得分:1)

Java不允许在一个.java文件中包含多个公共类。 因此,您可以根据需要通过声明DriveChain和其他Bicycle部件的私有内部类来执行您想要的操作,如果Bicycle是唯一将使用这些组件的类,则这是有意义的。深思熟虑的是你明天会设计一个Motorbike课程,可能会使用DriveChain的增强版。

如果这是真的,那么最好为每个组件制作公共类。

如果不是,我会遵循以下模式:

public class Bicycle {
    //declare all component classes first
    private class DriveChain {
    //impl
    }
    private class Handlebars {
    //impl
    }
    .....

    //Form private/public members from the already declared components 
    private int cadence;
    private int gear;
    private int speed;
    private ArrayList<DriveChain> dcArray ;   
    private Handlebars handlebars ;


    //Init each in constructor
    public Bicycle(int startCadence, int startSpeed, int startGear) {
         gear = startGear;
         cadence = startCadence;
         speed = startSpeed;

         //including the non parametrized ones
         dcArray = new ArrayList<DriveChain>();
         handlebars = new Handlebars();
    }

    //member functions that can now access any of the member fields and their internal functions as well.


}