views:

72

answers:

1

I'm a bit stuck on this SCJP practice question, specifically line 5 (with the String constructor). I thought it should be private, but the solution is 'protected'. I think protected access would not satisfy the requirement that all Alpha instances have the String alpha set to A. If the constructor is protected, then any other class that's also in package alpha, OR any subclass of Alpha regardless of package, can invoke it and set alpha to whatever it wants. Amirite? Can anyone clarify? Thanks!

alt text

+3  A: 

If the constructor were private, how would Beta call super(a)?

So it can't be private... but you're right: if it's protected then other types in the same package could indeed call

new Alpha("some other value")

In other words, I don't believe private is the right answer, but I don't believe there is a right answer. You can't limit visibility to only derived classes in Java.

EDIT: I've got it :)

Make Alpha abstract, and do what you like with the constructor, so long as it's visible to Beta (public or protected is fine). That way the third condition is automatically true, because there will never be any instances of just Alpha!

package alpha;
public abstract class Alpha {
    final String alpha;
    Alpha() { this("A"); }
    public Alpha(String a) { alpha = a; }
}

package beta;

public class Beta extends alpha.Alpha {
    public Beta(String a) { super(a); }
}

Now, this does require a bit of a weaselly interpretation of point 1. I would argue that an instance of Beta is an instance of Alpha (after all, instanceof will return true :) so that satisfies point 1, but an instance of Beta is not "an object of type Alpha" so point 3 is still okay.

Jon Skeet
Touché! But that still doesn't explain how the "alpha is never changed" requirement is satisfied by using protected. The way things are, it CAN be changed, right? Nor does it ensure that alpha is always "A". You can easily say Alpha a1 = new Alpha("B");
Anita
Yeah, "no right answer" is more along the line I was expecting. And yet this is supposed to have featured in a "real" exam. Awesome.
Anita
@Anita: The "alpha is never changed" requirement is entirely separate to the constructor bit. Just make it `final` (and ideally private) for that to work. But it's the "nor does it ensure that alpha is always "A" " bit that doesn't work whatever you do.
Jon Skeet
I'm probably the only one who misses `private protected` :-)
Bert F
@Anita: I've come up with a solution. It's horrible, and I doubt that it's what was intended, but it satisfies the requirements. See my edit - I'll put the code in in a minute.
Jon Skeet
Lovely solution, though clearly not intended :P
Anita
@Anita: I'm under the assumption that the first point implies that all instantiation of A and B occurs outside of packages alpha and beta, and the third point does not include subclasses of Alpha (which they mention explicitly in point two), even though it's not stated directly as such in either case. Which makes the *real* question why they didn't expect programmers to get technical about it. ;)
Tim Stone