Zwiebel
Zwiebel

Reputation: 1615

Objects to arrays?

I need to make the following (X and Y are only examples):

I have an X class. In that class I have objects, what I made. I have an another (Y) class, what extends the X class and implements Cloneable. In the X class, which objects I made, need to put them in an array. Then I need to clone it to the Y class. How can I do it?

Here is the code:

(X) class

import java.util.Scanner;

class Vehicle {
    static int speed;
    double direction;
    protected String ownerName;
    static int ID_number = 0;
    int initID_number;
    int ID;
    Scanner s = new Scanner (System.in);
    private final static String TURN_LEFT = "left";
    private final static String TURN_RIGHT = "right";

    Vehicle() {
        ID = ID_number++;
    }

    public Vehicle(String initOwner) {
        ownerName = initOwner;
    }

    public static void highestID() {
        System.out.println("The highest ID is: " + ID_number);
    }

    public static void changeSpeed(int speedNow) {
        speed = speedNow;
    }

    public static void stop(){
        speed = 0;
    }

    public static void turn(int degree) {
        System.out.println("The car turn in "+ degree);
    }

    public static void turn(String turn) {
        if (turn == TURN_LEFT) {
            System.out.println("The car turn left");
        }
        else if (turn == TURN_RIGHT) {
            System.out.println("The car turn right");
        }
    }

    public static void main(String[] args) {
        Vehicle Alfa = new Vehicle();
        Alfa.speed = 120;
        Alfa.direction = 12.11;
        Alfa.ownerName = "Alfa";
        Alfa.initID_number = 1;

        Vehicle BMW = new Vehicle();
        BMW.speed = 100;
        BMW.direction = 12.1411;
        BMW.ownerName = "BMW";
        BMW.initID_number = 2;

        Vehicle Chrysler = new Vehicle();
        Chrysler.speed = 90;
        Chrysler.direction = 131.1210;
        Chrysler.ownerName = "Chyrsler";
        Chrysler.initID_number = 3;

        System.out.println("Speed: " + Alfa.speed);
        System.out.println("direction: " + Alfa.direction);
        System.out.println("ownerName: " + Alfa.ownerName);
        System.out.println("ID_number: " + Alfa.ID);
        System.out.println("initID_Number: " + Alfa.initID_number);
        System.out.println();

        System.out.println("Speed: " + BMW.speed);
        System.out.println("direction: " + BMW.direction);
        System.out.println("ownerName: " + BMW.ownerName);
        System.out.println("ID_number: " + BMW.ID);
        System.out.println("initID_Number: " + BMW.initID_number);
        System.out.println();

        System.out.println("Speed: " + Chrysler.speed);
        System.out.println("direction: " + Chrysler.direction);
        System.out.println("ownerName: " + Chrysler.ownerName);
        System.out.println("ID_number: " + Chrysler.ID);
        System.out.println("initID_Number: " + Chrysler.initID_number);

        Vehicle Dacia = new Vehicle("Dacia");
        System.out.println();
        System.out.println("ownerName: " + Dacia.ownerName);

        highestID();                    

        changeSpeed(50);
        stop();
        turn(50);
        turn("right");

        }
            }

(Y) class

 class Garage extends Vehicle implements Cloneable {
    // need to make here the clone of the Vehicle's class array
}       

Upvotes: 1

Views: 173

Answers (3)

Andreas Dolk
Andreas Dolk

Reputation: 114787

Not sure if we share the same idea of cloneing - if you clone an instance of Y then the clone has the same (or equal) properties as the original instance - no extra arrays.

It's easier if you use a different technique to create a clone of a Y instance: the copy constructor. It goes like this:

public class Vehicle {
  static int speed;
  double direction;
  protected String ownerName;
  // ...

  Vehicle(Vehicle other) {
    speed = other.speed;
    ownerName = other.ownerName;
    // ...
  }
}

public class Garage extends Vehicle {  // A Garage is-a Vehicle ?? .. so what.

  Garage(Garage other) {
    super(other);
  }
}

Now if you want to clone a Garage, you simply do:

Garage original = getOriginal();
Garage myClone = new Garage(original);

Note - my example is quite simple, I don't clone the internal properties (no deep cloning), only references.


Note - in real world, a Garage is a container for Vehicles. That's what you try to model? Here's a starter:

 public class Garage {
   private Vehicle[] spaces = new Vehicle[10];  // like a garage for max 10 vehicles

   public boolean parkVehicle(int slot, Vehicle vehicle) {
     if (slot < 0 || slot >= spaces.length) return false;
     if (vehicle == null || spaces[slot] != null) return false;
     spaces[slot] = Vehicle;
     return true;
   }

   // ...
 }

Upvotes: 1

spot35
spot35

Reputation: 888

I'm pretty sure you have this the wrong way around. Vehicle needs to be Cloneable and Garage (which shouldn't extend vehicle) doesn't.

To clone a list of classes (objects), you first need to store the object somewhere. You could store the objects in the constructor of the vehicle class as a static data member

protected static List<Vehicle> vehicles = new ArrayList<Vehicle>();
...
public Vehicle(...) {
    vehicles.add(this);
}

And then access this list to clone them in the garage. This seems a little messy though.

Alternatively, you could store the list in the main method and then pass that list to a method in the garage.

Upvotes: 1

Alan Escreet
Alan Escreet

Reputation: 3549

You're looking to deep clone something that isn't Cloneable, perhaps the answer to this question will help you: Deep clone utility recomendation

On a side note: Is a Garage a Vehicle? If not (I think not), then you should also re-think your design. Think about composition instead of inheritance.

Upvotes: 2

Related Questions