2

我在android源代码中看到过这种方法。

 protected LocaleConfiguration doInBackground(Void... unused) {
                    LocaleConfiguration localeConfiguration = new LocaleConfiguration();
                    readConfiguration(Launcher.this, localeConfiguration);
                    return localeConfiguration;
                }
 private static void readConfiguration(Context context, LocaleConfiguration configuration) {
        DataInputStream in = null;
        try {
            in = new DataInputStream(context.openFileInput(PREFERENCES));
            configuration.locale = in.readUTF();
            configuration.mcc = in.readInt();
            configuration.mnc = in.readInt();
        } catch (FileNotFoundException e) {
            // Ignore
        } catch (IOException e) {
            // Ignore
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // Ignore
                }
            }
        }
    }

为什么不这样

 private static LocaleConfiguration readConfiguration(Context context) {
        LocaleConfiguration configuration = new LocaleConfiguration();
        DataInputStream in = null;
        try {
            in = new DataInputStream(context.openFileInput(PREFERENCES));
            configuration.locale = in.readUTF();
            configuration.mcc = in.readInt();
            configuration.mnc = in.readInt();
        } catch (FileNotFoundException e) {
            // Ignore
        } catch (IOException e) {
            // Ignore
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // Ignore
                }
            }
        }
        return configuration;
    }

修改参数而不是返回新值有什么好处

4

1 回答 1

2

修改参数而不是返回新实例的优点是您将实例化的控制权交给调用代码 - 即您允许它重用现有实例。

“修改参数”方法允许您使用几种这样的方法来初始化对象。例如

LocaleConfiguration localeConfiguration = new LocaleConfiguration();
readConfiguration(Launcher.this, localeConfiguration);
readSomeOtherConfiguration(Launcher.this, localeConfiguration);
return localeConfiguration;

可以说,您可以通过返回与作为参数传入的相同实例来做同样的事情,但我个人认为这是自找麻烦。

另一个可能的原因可能是如果实例化的成本很高,您可能想要回收旧对象。但是,您提供的代码似乎并非如此,这是一种优化,因此仅在绝对必要时才考虑这样做!

就个人而言,除非有特定的理由不这样做,否则我倾向于采用“返回新实例”的方法。我认为它更简单,并且降低了调用代码中出现细微错误的可能性。

于 2013-02-06T09:50:19.333 回答