鉴于我已经存在以下结构:
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()
或 compose()
链接起来,但它有什么缺点吗?
要获得更多引用,我可以使用以下内容:
((UnaryOperator<String>)MapperUtils::incrementAsInt).andThen(/*something*/)
要手动把它转给一个运算符(operator),但它真的很难看。但是,如果我同时提供两者,它是否会在代码库上创建不需要的方法爆炸?
最佳答案
如果两者都保留,则 incrementAsIntOperator()
可以写成
public static UnaryOperator<String> incrementAsIntOperator() {
return input -> incrementAsInt(input);
}
这告诉我你的第二个只是第一个的更专业的版本。
我会保留第一种方法,因为它的可重用性更高,而放弃第二种方法。
是否同时提供两者都会给您带来“不需要的方法爆炸”,这完全取决于您。除此之外,我看不出它有什么缺点。当然你也可以使用这个:
String newId = FileUtils.readAndModifyFileEntry(StageRename.ID_FILE, "id",
input -> MapperUtils.incrementAsInt(input));
关于java - 如何在静态帮助类中声明功能接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22681885/