用于添加多个对象实例的Varargs

时间:2010-09-26 13:46:19

标签: java variadic-functions

我需要将我的PhoneNumber(数字,类型)的多个条目添加到我的主Person(姓名,PhoneNumber)对象。

我可以使用varargs来解决这个问题吗?或者有更好更有效的方法吗?

我正在尝试如下工作:

// number is a String and type is an enum

PhoneNumber [] numbers = {

    new PhoneNumber(number , type),
    new PhoneNumber(number,type),
    new PhoneNumber(number,type),

};

class Person(){

 Person(String name, PhoneNumber...numbers){

  // adding all the phonenumber objects to a list for each person.
}

我不确定这是否是实施它的正确方法以及varargs是否是最佳选择?

请指教。我知道它是一个基本的java问题,但没有找到更好的解决方案来解决上述问题。

5 个答案:

答案 0 :(得分:2)

要问的问题是:

  

如果Person为零PhoneNumber

Person::addPhone(PhoneNumber phone) { ... } 是否可以成为有效对象?

如果是,请从构造函数中删除PhoneNumber并创建

Person

然后你不需要varadic构造函数。如果PhoneNumber在没有数字的情况下无效,那么传递{{1}}的可变大小列表就更清楚了。

“有效”是指对象在逻辑上是否一致。当然,对于没有电话号码的对象,你不能使用Person :: SendSMS,但我自己可能没有联系号码,仍然是你想要跟踪的有效实体。

答案 1 :(得分:1)

这不是一个糟糕的选择。 我也会添加另一个构造函数来处理集合。

我对你的代码唯一不确定的是构造函数应该处理或不处理PhoneNumbers,但是因为你这样做,我想你有充分的理由。

答案 2 :(得分:0)

我认为应该没问题, 但是你不需要构造一个电话号码数组,因为你在Person的构造函数中有varargs作为参数。

你可以像这样直接调用Person的构造函数。

Person p = new Person("JOHN", new PhoneNumber(numbertype.HOME, "123"),
                new PhoneNumber(numbertype.OFFICE, "456"), new PhoneNumber(
                        numbertype.OTHER, "789"));

答案 3 :(得分:0)

我只是分开手机部分。像

class Person(){

 Person(String name){
 }

 void addPhoneNumbers(PhoneNumber...numbers) {
 }
}

答案 4 :(得分:0)

我想知道,这些电话号码来自哪里?这些电话号码不太可能出现在源代码中。我的意思是,你真的认为有人会在现实代码中写出类似new Person("arthur", phoneNo1, phoneNo2, phoneNo3)的内容吗?

我不这么认为(好吧,这样的代码可以出现在单元测试中,但不能出现在'真正的'代码中)。这些信息将来自配置文件,来自用户的操作,或来自网络的流,任何内容。在任何情况下,电话号码将逐个或以Collection某种形式出现。所以,我建议您使用方法addPhoneNumber(PhoneNumber n),并选择方法addAllPhoneNumbers(Collection<PhoneNumner> ns)

我建议只在您需要的时候添加后一种方法,或者如果您确定它会有用。毕竟,这只是一种方便的方法。

我认为仅当开发人员可能手动编写方法调用时,varargs才有用(String.format适当使用varargs)。