通过JOOL
的{{1}}库,它在Streams上提供了大量的功能接口和实用程序类。
我的问题是这个库支持1-16个参数功能接口。这有意义吗?因为我一直在练习中将方法中的参数数量减少到3个。虽然可接受的数量根据不同的思想领袖而有所不同。但没人说16。
请参阅StackOverflow本身的参考链接:
what is the standard number of parameters that a java method should have?
此外,它提供了一个实用程序类JOOQ
,它看起来仅限于顺序处理。
具有良好过去使用JOOL经验的人能否回答为什么我应该使用JOOL,因为它看起来很多东西都没用?
答案 0 :(得分:5)
函数中没有设定数量的参数我认为是最佳实践,我认为你应该使用你需要的东西而不会走极端,造成效率低下或使你的代码难以阅读。如果你发现自己有一个带有10个参数的函数,那么请三思而后行(或许它有意义)。
有几个库使用接收10多个参数的函数:
其原因主要是编译时类型检查。你也可以争论提高效率和清洁度。
以Guava的of
函数为例:
ImmutableMap<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4)
使用如下:
Map<String, Integer> m = ImmutableMap.of("Ashlyn", 127,
"Abigaile", 128,
"Alexis", 132,
"Ashlynn", 132);
此函数接收8个参数,提供:
因为在编译时检查“奇数”参数为String
和“偶数”参数为Integer
)。您无法使用vararg函数执行此操作,因为您需要将varargs参数声明为Object...
,从而丢失编译时类型检查。
通过使用像:
这样的中间对象,您可以获得编译时类型安全性Map.ofEntries(entry("Ashlyn", 27),
entry("Abigaile", 28),
entry("Alexis", 32),
entry("Ashlynn", 32))
顺便提一句exists in Java 9,但是你将创建4个8参数版本不需要的中间对象。您还将创建一个额外的数组对象来保存varargs对象。
比较前两段代码,包含entry()
意味着更多字母可以输入和读取。这可能是一种主观的,但至少我更喜欢代码看起来如何不包含entries
。
jOOλ起到了解决这些Java API缺陷的作用:
你有功能和BiFunction,但你不能做类似的事情
TriFunction<Integer, String, Boolean, Double>
。
除非你使用jOOλ,否则你必须牺牲一个参数(或类型安全)。
Java完全缺少元组,你需要使用javatuples或jOOλ,除非你想再次牺牲类型安全性。
Java的API中存在其他与此问题无关的缺陷,但是jOOλ(我最喜欢的那个)能够传递一个抛出已检查异常的lambda。
答案 1 :(得分:4)
jOOλ作者在这里。
您似乎遇到的困难是,业务逻辑和特定库函数中的普通方法有些相关。他们不是。让我解释一下:
...确实不应该超过三个论点,因为一旦你超过这个数字,你的一些论证很可能是以一种值得将它们重新设计成一个类的方式强烈联系的。
这是面向对象的基础知识,适用于各种用例。
......不限于这种面向对象的设计原则。在jOOλ的情况下,该库实际上围绕(几个)语言限制,特别是缺少一流的元组支持。
那里有许多语言(SQL是最突出的语言之一)支持元组,它们就像Java中的类,区别在于:
将Tuple16<T1, T2, ..., T16>
视为与具有16个命名属性(以及getter / setter,如果您喜欢)的Java类相同的东西。可以认为Function16<T1, T2, ..., T16, R>
与接受具有16个命名属性的类的Java方法相同。
因此,这些差异主要是风格性的。与其他一般相比,一种方法并没有真正的优势。
现在,如果您是一名正在使用Java的函数式/声明性程序员,那么Java语言和JDK API的局限性会限制您对程序的推理方式。这就是为什么jOOλ存在的原因之一,是为了帮助这些人假装Java语言实际上有元组和函数应用于元组,并且为了模仿它,嗯,jOOλ必须“重载”相同类型的函数16次 - 16是任意上限(.NET将元组限制为8级,Scala将它们限制为22)。
我的问题是这个库支持1-16个参数功能接口。这有道理吗?
是的,即使你通常只使用程度较低的那些,你偶尔也会发现Tuple16<T1, T2, ..., T16>
有用,就像你设计课程时一样,这些课程大多只有一些属性,你会发现自己写作偶尔会有16个属性的课程。
虽然可接受的数字根据不同的思想领袖而有所不同。但没有人说16。
从面向对象的教条中解脱思绪。思想领袖说出一些东西总是有原因的。在一个背景下确实如此,但从来没有普遍真实。你有没有用16列编写SQL查询?当然有。为什么它在SQL中可以接受而在Java中不可接受?
此外,它提供了一个实用程序类Seq,它看起来仅限于顺序处理。
是的,这是主要的设计目标。顺序处理允许在并行处理中没有意义的相当多的附加功能,但在JDK的Stream API中却非常缺失。
具有良好过去使用JOOL经验的人能否回答为什么我应该使用JOOL,因为它看起来很多东西都没用?
如果您没有看到它的用途,请不要使用它。但是根据你的评论(你似乎更喜欢在类型元组上传递Object[]
),我认为你确实理解它的用法,你只是不想写下类型,因为它是Object[]
,如果不是一个穷人,那个随意度数的无类型元组?