我有两个班级
BaseClass的
public class BaseClass
{
public int baseClassVariable = 10;
//like this 10 to 20 variables
}
子类
public class SubClass extends BaseClass
{
public int subClassVariable = 20;
//like this 30 to 40 variables
}
还有一个主要课程:
public class TestMain
{
public static void main(String[] args)
{
Map<String, BaseClass> myData = new HashMap<String, BaseClass>();
SubClass mydata = new SubClass();
myData.put("Test", mydata);
for (Entry<String, BaseClass> data : myData.entrySet())
{
System.out.println(data.getKey() + "-" + data.getValue());
}
}
}
正如您所看到的,在我的主要课程中,我有Map
String
和BaseClass
。我的期望是保持较少的内存占用,所以我需要在内存中只保留BaseClass
个变量,这些变量是应用程序中经常使用的数据,但在应用程序中需要子类来进行某些计算,因此在应用程序中将创建子类
现在我的问题是存档我期望的最佳方式(超类和子类)(现在它没有按照期望工作,因为继承)或者我需要使用不同的机制来实现它。
我的最终目标是仅在地图中保留BaseClass
个变量。
答案 0 :(得分:0)
Casting不会以任何方式修改对象。它是一个编译时操作,它告诉编译器它可以期望一个对象具有特定类型的字段和方法 - 在这种情况下是一个超类。
为了将对象从子类类型“转换”为超类类型,您可以做的是有一个接受超类实例的构造函数,如下所示:
public BaseClass(BaseClass template){
baseClassVariable=template.baseClassVariable;
// ... and so forth for all fields
}
请注意,您可以将子类实例传递给构造函数。由于它只会复制其“已知”字段,因此仍会产生仅包含超类字段的超类实例。
另请注意,对于非基本类型,仅复制引用可能很危险,因为原始实例和新创建的实例仍引用相同的字段。对于复杂的数据结构,您可能需要深度复制引用的字段,例如通过Object.clone()
。
答案 1 :(得分:-1)
施放不能完成你期望完成的工作。
您有几个选择:
将所有要保留的值复制到另一个对象中:
public PreservedData(WholeBunchOfData data) {
this.somevar = data.somevar;
// Copy the values to be preserved manually
}
使用单独的对象将可支配值放入:
class BaseClass {
int valueToBePreserved = 29;
String otherValueToBePreserved = "";
DisposableObjectContainingDisposableValues someDisposableObj = ...;
}
class SubClass {
int disposableValue = 13;
String someOtherDisposableValue = 47;
}
完成后,只需将对象设置为null。
this.someDisposableObj = null;
很快就会收集垃圾。
但是,您应该考虑增益是否大于成本。如果它只是一些原始值或不是很大的对象,那很可能就不会有那么多的内存。