我需要将我的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问题,但没有找到更好的解决方案来解决上述问题。
答案 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)。