Java 我面临声纳建议问题,该方法有8个参数,大于我代码中授权的7个

Java 我面临声纳建议问题,该方法有8个参数,大于我代码中授权的7个,java,Java,我在下面的代码中面临声纳问题 其中声纳显示该方法有8个参数,大于7。那么,我们如何通过将这些参数放入数组或映射来解决这个问题呢 private void appendSchemeSpecificPart(StringBuilder sb, String opaquePart, String authority, String userInfo, String host, int port, String path, String query

我在下面的代码中面临声纳问题

其中声纳显示该方法有8个参数,大于7。那么,我们如何通过将这些参数放入数组或映射来解决这个问题呢

private void appendSchemeSpecificPart(StringBuilder sb,
    String opaquePart,
    String authority,
    String userInfo,
    String host,
    int port,
    String path,
    String query
)
我无法生成数组并将其传递给此方法
appendSchemeSpecificPart()


有人能帮忙吗?

不要使用数组传递多个语义不同的对象。
它非常容易出错。
而不是在类中提取具有高内聚性的参数:
SchemeSpecificPart
,并将其定义为如下参数:

void appendSchemeSpecificPart(StringBuilder sb, SchemeSpecificPart schemeSpecificPart){..}  
StringBuilder
不是
SchemeSpecificPart
概念的一部分。因此,我们不会在中定义它

现在,您可以调用您的方法:

StringBuilder sb = ...;
SchemeSpecificPart part = ...;
appendSchemeSpecificPart(sb, part);  

这不是您的问题,但请注意,通过调用的方法修改参数状态(此处为
StringBuilder sb
)是一种不安全的方法。
它赋予
appendSchemeSpecificPart()
方法比它需要的更多的职责。例如,该方法可能会删除
sb
的现有内容,但它不应该这样做),而且它还可能使理解接受
StringBuilder
的每个方法的实际功能变得更加困难,因为所有方法都可以覆盖前一个方法所做的事情

返回字符串看起来更清晰、更健壮:

String computeSchemeSpecificPart(SchemeSpecificPart schemeSpecificPart){...}
并使用它:

SchemeSpecificPart part = ...;
StringBuilder sb = ...;  
sb.append(computeSchemeSpecificPart(part));

主机和端口的组合称为套接字地址。已存在用于保存这对值的类:

通过将2个参数合并为1,将不会超过阈值。您还可以查看是否可以合并其他相关参数


几乎看起来
字符串主机、int端口、字符串路径、字符串查询
实际上只是一个URL,但很难说没有看到实现。

最好理解为什么会出现这个问题

从声纳上看,这被归类为“大脑过载”——目的是使代码更容易阅读和理解

一个长参数列表可以指示应该创建一个新结构 创建以包装大量参数或函数正在执行的操作 太多东西了


尝试将这些字段封装在不同的类中,并将该类的实例传递给您的方法。

为什么要传递
StringBuilder
对象,在方法调用后是否使用它?您可以引入参数对象或使用生成器模式而不是构造函数。是的,您不能对此使用array或arraylist,因为它们属于不同的类型…是否有其他方法进行声明。事实上,您不能使用
列表
对象[]
,但您将完成大量不安全的转换。在同一个类中合成具有高内聚性的字段确实是正确的方法。但我认为架线工应该离开。我更新。@aniketkanojia用信息编辑您的问题,谢谢这段代码用InetSocketAddress为我编写。