首页 > 解决方案 > 重构 ArrayList 写入文件

问题描述

我不确定如何有效地重构以下代码。

在下面的代码中,有两种方法分别将数据写入文件。它们都非常相似,除了:

常识告诉我,这可以重新分解为单个 write 方法,然后这两个方法将调用该方法,但不知道如何实现这一点。

    public void updateAccount(Account account) {
        String outputString = outputStringCreator(account);
        writeOutputString(outputString);
        }

    public void updateAccounts(ArrayList<Account> accounts) {
        BufferedWriter writer = null;
        try {
            writer = new BufferedWriter(new FileWriter(filePath));
            for(Account account : accounts) {
                writer.write(outputStringCreator(account));
                writer.newLine();
            }
        } catch (IOException e) {
            System.out.println("IO issue: " + e.getMessage());
        } 

        if (writer != null) {
            try {
                writer.close();
            } catch (IOException e) {
                System.out.println("Couldn't close writer: " + e.getMessage());
            }
        }
    }

    public void writeOutputString(String outputString) {
        BufferedWriter writer = null;
        try {
            writer = new BufferedWriter(new FileWriter(filePath));
            writer.write(outputString);
            writer.newLine();
        } catch (IOException e) {
            System.out.println("IO issue: " + e.getMessage());
        } 

        if (writer != null) {
            try {
                writer.close();
            } catch (IOException e) {
                System.out.println("Couldn't close writer: " + e.getMessage());
            }
        }
    }

标签: javarefactoring

解决方案


您可以轻松地简化重载方法,其中一个采用单个参数,另一个采用集合,如下所示:

void foo( ObjectType object ) {
    //pack object into singleton list 
    foo( List.of( object ) ); 
}
void foo( List< ObjectType > objects ) { 
    //execute logic on collection
}

您的收集方法应该能够处理列表只有一个元素的情况。这样,您可以轻松地从重载方法中传递单例列表并只编写单个算法。


推荐阅读