【发布时间】:2019-11-03 07:21:00
【问题描述】:
当类中的其他方法多次使用它们时,我喜欢在私有和最终实例变量中存储可以表示为一行 lambda 的简单函数。
我有时也会使用未多次使用的函数来缩短大型方法并更好地表达方法中使用的功能。
public class SomeClass {
private final UnaryOperator<Something> someMethod = s -> doSomething;
public void someMethod2(Something s) {
//some code which goes over several lines and uses someMethod variable
}
public void someMethod3(Something s) {
//some code which goes over several lines and uses someMethod variable
}
}
另一个例子,其中输入是为帮助类中的不同服务预先准备好的。必须在两个服务的字符串中替换两个相同的字符。这个函数没有存储一个普通的静态方法,它存储在一个实现 UnaryOperator 的静态字段中。
public class PrepareServicesInputHelper {
private static final UnaryOperator<String> replaceSignsForAllServices = s -> s.replace('+', '-')
.replace('/', '*');
public static String transformStringForServiceOne(String s) {
return "Additional transformation information for service one" + removeUnwantedSigns.apply(s);
}
public static String transformStringForServiceTwo(String s) {
return "Additional transformation information for service two:" + removeUnwantedSigns.apply(s);
}
}
这样对我来说看起来更好,更清晰。
这是一个好主意,还是有一些实用的缺点,或者使用这种方法会损害一些干净代码的范例,并且功能应该传统地存储在实例方法中?
【问题讨论】:
-
您真的需要实例变量还是
static也可以? -
在这种情况下,静态变量也可以做到这一点。但是我看不到这样做的好处,如果静态变量只能由实例方法使用并且由于它是私有的而没有实例就无法访问。
-
好处是您的实例将占用更少的内存,并且它们都将共享一个 lambda 函数对象,而不是每个实例都有自己的副本。
-
我想看看您的真实用例,否则我无法判断您的方法是否良好,或者它是否滥用或误解了 Java 函数式方法。
-
@HonzaZidek 添加了另一个示例。
标签: java-8 functional-programming object-oriented-analysis method-reference functional-interface