gpt4 book ai didi

java - DRY:最小化 Java 中的重复代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:01 28 4
gpt4 key购买 nike

我正在用 Java 编写一个方法:

List<Foo> computeFooList(/* arguments */)
{
/* snip */
}

我想用完全相同的逻辑编写第二个方法,但返回类型不同:

List<String> computeStringList(/* same arguments */)
{
/* snip */
}

我正在尝试找出一种非 hackish 的方法来最小化两种方法之间重复代码的数量。两者之间唯一的逻辑区别是,在将对象添加到返回的列表时,第一种方法添加了实际的 Foo。 :

List<Foo> computeFooList(/* arguments */)
{
List<Foo> toReturn = ...
...
for (Foo foo : /* some other list of Foo */)
{
if (/* some condition */)
{
toReturn.add(foo);
}
}
...
return toReturn;
}

第二个添加一个 String Foo 的代表:

List<String> computeStringList(/* same arguments */)
{
List<String> toReturn = ...
...
for (Foo foo : /* some other list of Foo */)
{
if (/* some condition */)
{
toReturn.add(foo.toString());
}
}
...
}

实际上,事情并不那么那么简单。我不想添加 FootoReturn除非我绝对确定它属于那里。因此,该决定是根据 - foo 做出的。使用辅助函数。对于两个不同版本的方法,我也需要不同版本的辅助函数 - 最后,我将编写两组几乎相同的方法,但只针对一个小的泛型类型。


我能否编写一个包含所有决策逻辑的单一方法,但可以生成List<Foo>List<String> ?是否可以在不使用原始 List 的情况下执行此操作?类型(泛型领域的不良做法!)或通配符 List<?>类型?我想象一个看起来像这样的实现:

List<Foo> computeFooList(/* args */)
{
return computeEitherList(/* args */, Foo.class);
}

List<String> computeStringList(/* args */)
{
return computeEitherList(/* args */, String.class);
}

private List<???> computeEitherList(/* args */, Class<?> whichType)
{
/* snip */
}

有什么好的、优雅的方法可以做到这一点吗?我一直在尝试使用通用方法,但我看不出有什么方法可以做到这一点。即使是用反射来捣乱也没有让我得到任何地方(也许我需要像 TypeToken 这样的东西? ...eww)。

最佳答案

你不能将转换逻辑外化到一个单独的策略中吗(比如 Guava 的 Function<F, T> ):

public <T> List<T> computeList(/* arguments */, Function<? super Foo, T> f) {
List<T> toReturn = ... ...
for (Foo foo : /* some other list of Foo */) {
if (/* some condition */) {
toReturn.add(f.apply(foo));
}
}
return toReturn;
}

computeFooList:

computeList(..., Functions.identity());

计算字符串列表:

computeList(..., Functions.toStringFunction());

关于java - DRY:最小化 Java 中的重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810354/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com