我只是学习Java,但我的问题是Java相关和一般.
我的情况是这样的:我有一个方法,我想通过继承通常由几个类使用.在方法块中,我需要声明一个调用类的变量,从中创建对象,这些对象位于调用类的ArrayList <>("array")中,并通过ObjectOutputStream("output")发送输出到序列化文件.
我有以下课程:
CustomerInternalFrame.java,它使用Customer类型的ArrayList维护序列化Customer.java的"数组".
ContractorInternalFrame.java,它使用类型为Contractor的ArrayList维护序列化Contractor.java的"数组".
VendorInternalFrame.java,它使用Vendor类型的ArrayList维护序列化Vendor.java的"数组".
在每个这些InternalFrame类中,我有以下方法addRecords(将"Customer"替换为相应的类,Customer,Contractor或Vendor):
private void addRecords() {
// object to be written to the file
Customer record;
// loop until end of array
for (Customer element : array) {
// check for closed streamer and invalid entries
try {
// create a new object from current fields
record = new Customer(
element.getName(),
element.getLastName(),
element.getAddress1(),
element.getAddress2(),
element.getCity(),
element.getState(),
element.getZip(),
element.getPhone(),
element.getCell());
// write new record
output.writeObject(record);
} // end try
... (catch blocks)
} // end for
} // end method
Run Code Online (Sandbox Code Playgroud)
我一直在努力寻找一种方法,以编程方式更改上面的单词"Customer",这样我就可以声明一个方法(或类)addRecords()并让三个InternalFrame类中的每一个都使用它,而不需要重复代码.在所有情况下,我当然不能用"对象"替换"客户"这个词,因为"对象"没有我的方法getName(),getAddress1()等.我也不能用"对象"替换"客户" "阵列,出于同样的原因.(换句话说,使用数组 - 正常的解决方案 - 在这种情况下不起作用,因为我必须使用超类数组然后向下转换它,但是向下转换它需要首先声明最初命名的类.因此,在这种情况下,数组只是一个恶性循环.)
我意识到有三个单独的addRecords()方法允许我更改我在相应文件中记录的任何字段,因为Customer,Contractor和Vendor可能具有不同的字段集.但是我有其他类似的情况,我在代码中所做的事情是相同的,但是由不同的类(例如类似的事件处理程序)调用,并且能够知道是否这样的事情肯定会很好可以完成.
那么,有没有办法改变一个变量类型,包括将一个传入一个方法或构造函数,以便几个类可以使用相同的代码来创建那些特定类的对象?
像这样使你的基类通用:
public abstract class InternalFrame<T> {
protected abstract Collection<? extends T> getElements();
protected abstract Serializable getRecord(final T t);
public void serialize(final File file) {
try (final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) {
for(final T t : getElements()) {
oos.writeObject(getRecord(t));
}
} catch (IOException ex) {
//handle
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在扩展类中,您只需要实现这些abstract方法
public class CustomerFrame extends InternalFrame<Customer> {
@Override
protected Collection<? extends Customer> getElements() {
return array;
}
@Override
protected Serializable getRecord(Customer element) {
return new Customer(
element.getName(),
element.getLastName(),
element.getAddress1(),
element.getAddress2(),
element.getCity(),
element.getState(),
element.getZip(),
element.getPhone(),
element.getCell());
}
}
Run Code Online (Sandbox Code Playgroud)
你会调用该serialize(final File file)方法将记录写入a File.
| 归档时间: |
|
| 查看次数: |
707 次 |
| 最近记录: |