Class initialization and sharing

Hey guys,

Recently I have found a problem with the way I’m trying to initialize and share a class. I’ll explain better the problem I have:

I have two programs:

  • AttributeManager(program to create attributes for character, an example of attribute is “Health”)
  • Game Client

So on AttributeManager I create some attributes like Health, Mana, Energy, etc. There is shared Serializable class, which represents each attribute, let’s say:

class Attribute implements Serializable
{
private String name;
private int intial_value;
public Attribute(){}
// ... Here goes gets and sets
}

After creating all the “attributes” I store them to Hashtable <String, Attribute> attribute_list and save it to file, since Hashtable is serializable it’s no problem opening it in the other application.

In game, I initialize the list when loading game client to the class Data, reading the entry of file stored by AttributeManager

class Data
{
// I read the content of file to this variable
public static Hashtable <String, Attribute> attribute_list;

private Data(){}
}

Now where the problem is:
What I’m doing is the following, when I initialize main character(it also has attribute_list variable) i set the list stored in Data.attribute_list, when some other character does login, I also use Data.attribute_list to intialize it’s attribute list… The problem is that attributes become shared - LOGICALLY. So I did found another solution, which is reading from file everytime I instantiate new character, but I think from the performance side it’s not the best solution… Is there any other way of doing it, simply by loading once from file?

I was thinking in creating a method copy(), which would iterate hashtabe and copy the values and not the entire class…

Thanks in advance.

Yup, you’ll need to manually copy everything. In Java, no copies of objects are made automatically like in some other languages. Every object has a clone() method, but that returns a shallow copy of the object for Collection’s (a copy of the pointers but not the data). Usually I provide a constrictor that takes that object as its only parameter for making copies, i.e. MyClass copy = new MyClass(otherMyClass) .

Ok, thanks a lot, going to think the best way of doing this(the idea of constructor seems very nice)

If you’re not so bothered about high performance copying, and your class is properly serializable, you can also use Java serialization to make deep copies of objects, which can be very handy.

Cas :slight_smile:

I think I know what I’m going to do :stuck_out_tongue:
I’m going to read some java documents about serialization of objects…

Thats interesting to know the Java dows not like copying classes.

In the past for small projects i have created a static class, say ‘characterTemplate’ that has static character classes and a Load() method that loads them all from some data file (or just manualy instanceated them in-code). THis is basicaly to hold an in-memory cache of all my most commonly used characters/sprites/partical-effects, etc.

Then, whenever i want say a new ‘PlasmaBomb_A’, i just go to the template class and copy the static PlansmaBomb_A into a new ‘projectile’ class and off I go.

THis was in C#/XNA however. Are you saying that this would not work in Java? or that i would need to have a clone() or constructor like

classX(classX x)
{
   this.a = x.a;
   this.b = x.b;
}

for each of my character type classes?

thats not really a problem or anything doing it that way.
Just wanted some clarification :slight_smile: