2

鉴于我已经存在以下结构:

private void acceptInner(final Path path) throws IOException {
    String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id", 
        idString -> String.valueOf(Integer.parseInt(idString) + 1));
    BaseUtils.moveKeepExtension(path, StageRename.OUTPUT_DIRECTORY, newId);
}

其中FileUtils.readAndModifyFileEntry声明为:

public static String readAndModifyFileEntry(final Path path, final String entryKey 
    , final UnaryOperator<String> operator) throws IOException { ... }

现在我想将一个将字符串值作为整数加一的运算符移动到一个新的辅助类中,我提出了两个建议:

final public class MapperUtils {
    private MapperUtils() {
        throw new UnsupportedOperationException();
    }

    public static String incrementAsInt(final String input) {
        return String.valueOf(Integer.parseInt(input) + 1);
    }

    public static UnaryOperator<String> incrementAsIntOperator() {
        return input -> String.valueOf(Integer.parseInt(input) + 1);
    }
}

哪个更好,用法如下:

String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id",
    MapperUtils::incrementAsInt);

相对

String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id", 
    MapperUtils.incrementAsIntOperator());

还是我应该保留两者?

后者的优点之一是我可以用andThen()or链接运算符compose(),但它有什么缺点吗?

如需更多参考,我可以使用以下内容:

((UnaryOperator<String>)MapperUtils::incrementAsInt).andThen(/*something*/)

手动将其转换为操作员,但它确实看起来很难看。但是,如果我同时提供两者,它是否会在代码库上创建不需要的方法爆炸?

4

1 回答 1

0

如果两者都保留,则incrementAsIntOperator()可以写为

public static UnaryOperator<String> incrementAsIntOperator() {
    return input -> incrementAsInt(input);
}

这告诉我你的第二个只是第一个的更专业的版本。

我会保留第一种方法,因为那个方法更可重用,然后去掉第二种方法。

是否同时提供两者都会给您带来“不需要的方法爆炸”,这完全取决于您。除此之外,我看不出它有什么缺点。当然你也可以使用这个:

String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id", 
    input -> MapperUtils.incrementAsInt(input));
于 2014-03-27T08:30:59.883 回答