以编程方式声明常用方法的变量(不使用数组)

时间:2013-06-14 23:56:36

标签: java class variables

我只是在学习Java,但我的问题是Java相关和一般。

我的情况是这样的:我有一个方法,我想通过继承通常由几个类使用。在方法块内部,我需要声明一个调用类的变量,从中创建包含在ArrayList<>中的对象。 (“数组”)调用类,并通过ObjectOutputStream(“output”)将输出发送到序列化文件。

我有以下课程:

CustomerInternalFrame.java,它使用Customer类型的ArrayList维护序列化Customer.java的“数组”。

ContractorInternalFrame.java,它使用类型为Contractor的ArrayList维护序列化Contractor.java的“数组”。

VendorInternalFrame.java,它使用Vendor类型的ArrayList维护序列化Vendor.java的“数组”。

在每个这些InternalFrame类中,我都有以下方法addRecords(将“Customer”替换为相应的类,客户,承包商或供应商):

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

我一直在努力寻找一种方法,以编程方式更改上面的单词“Customer”,这样我就可以声明一个方法(或类)addRecords()并让三个InternalFrame类中的每一个都使用它,无需重复代码。在所有情况下,我当然不能用“对象”替换“客户”这个词,因为“对象”没有我的方法getName(),getAddress1()等。我也不能用“对象”替换“客户” “阵列,出于同样的原因。 (换句话说,使用数组 - 正常的解决方案 - 在这种情况下不起作用,因为我必须使用超类数组然后向下转换它,但是向下转换它需要首先声明最初命名的类。因此,在这种情况下,数组只是一个恶性循环。)

我意识到有三个单独的addRecords()方法允许我更改我在相应文件中记录的任何字段,因为Customer,Contractor和Vendor可能具有不同的字段集。但是我有其他类似的情况,我在代码中所做的事情是相同的,但是由不同的类(例如类似的事件处理程序)调用,并且能够知道是否这样的事情肯定会很好可以完成。

那么,是否有任何方法可以更改变量类型,包括将一个变量传递给方法或构造函数,以便多个类可以使用相同的代码来创建这些特定类的对象?

1 个答案:

答案 0 :(得分:5)

让你的基类像这样通用:

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
        }
    }
}

然后在扩展课程中,您只需要实现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());
    }

}

您可以调用serialize(final File file)方法将记录写入File