gpt4 book ai didi

java - 在方法签名中使用对象作为参数与方法重载

转载 作者:行者123 更新时间:2023-11-29 08:24:18 24 4
gpt4 key购买 nike

我有一个方法,需要将单个域对象或它们的集合传递给它。对传递的参数的处理略有不同,具体取决于它是单个实例还是集合。我可以寻求有关最佳方法的建议吗?我是否应该使方法签名接受对象类型,然后使用 instanceof 进行处理并向下转换,如下所示?

private static synchronized void mymethod(Object obj) {
if (obj instanceof List ) {
...
}
else if (obj instanceof MyObjectClass) {
...
}
}

或者我应该使用重载吗?每种情况都有陷阱吗?我知道第一种情况有点危险,因为它可以接受传递给它的任何内容,但是我的代码并不意味着用作 API 或扩展等。

最佳答案

解决此类设计“问题”有不同的方法。

使用方法重载:

void myMethod(final MyObject myObject);
void myMethod(final List<? extends MyObject> myObjects);

使用 var-args 输入参数:

void myMethod(final MyObject... myObject);

-> myMethod(myObject);
-> myMethod(myObject, myOtherObject);
-> myMethod(myObjectsArray); // myObjectsArray = new MyObject[]

使用 Collection/List作为输入参数:

void myMethod(final Collection<? extends MyObject> myObjects);

-> myMethod(Collections.singletonList(myObject));
-> myMethod(myObjectCollection); // List<MyObject>, Set<MyObject>, Collection<MyObject>

就我个人而言,我会选择方法重载,因为内部逻辑通常会发生变化,也许会略有变化,但它会发生变化。意图更加明确,JavaDoc可以针对单个方法进行定制。

我是一个“挑剔”的开发人员,我更喜欢明确声明可以有两种形式的输入。我更喜欢重载,即使它可能没有必要(目前)。在这种情况下,我只需委托(delegate)给 Collection<?>方法,或相反。

void myMethod(final MyObject object) {
myObject(Collections.singletonSet(object));
}

但这是基于意见。

我想说最重要的一点是,不要重复代码!

关于java - 在方法签名中使用对象作为参数与方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54629278/

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