Is there a way to find out whether a Java function (or a constructor) that takes varargs was actually called with varargs or with an array?
Say I have the following:
public class MyCompositeObjects {
MyObject[] objects;
MyCompositeObjects(MyObjects... objects) {
this.objects = Arrays.copyOf(objects,objects.length);
// or just: this.objects = objects; ?
}
// ...
}
The constructor may be called with a single MyObject[] argument, which may change later, and if I do not copy the array in the constructor those changes will apply to the member variable objects as well, right? However, if the constructor is called with several MyObjects, there is no other reference to the array* to change it later outside the class, so I could assign it directly. Can I tell inside the constructor (or, generally, any function that takes varargs) how it was called?
*nb: Is there a specific name for this? Is it simply an anonymous array?
No, you can’t. It’s meant to be entirely transparent – this code:
is exactly equivalent to
If you can trust your callers to do the right thing, you could always create two static methods and make the constructor private:
Note how the “with copy” version doesn’t use varargs, which should help users to use the right version.