Dúvida em modificadores de acesso

Insert six modifiers into the code such that it meets all of these requirements:

  1. It must be possible to create instances of Alpha and Beta from outside the package in which they are defined.
  2. When an object of type Alpha (or any potential subclass of Alpha) has been created, the instance variable alpha may never be changed.
  3. The value of the instance variable alpha must always be “A” for objects of type Alpha.

[code]package alpha;

_____ class Alpha{
_______ String alpha;
_______ Alpha(){ this(“A”); }
_______ Alpha(String a){ alpha = a;}
}[/code]

package beta; _______ class Beta extends alpha.Alpha{ ____ Beta(String a){ super(a); } }

Os modificadores permitidos eram o private, public e protected. A minha solução foi a seguinte:

[code]package alpha;

public class Alpha{
private String alpha;
public Alpha(){ this(“A”); }
_______ Alpha(String a){ alpha = a;}
}[/code]

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

Para satisfazer a condição 2, coloquei um private na variável alpha. Para satisfazer a condição 1, coloquei o modificador public em ambas as classes (para estas serem visíveis de fora do pacote), bem como coloquei o construtor de Beta como public (pois era o único construtor presente nesta classe). Também coloquei o construtor Alpha() como public, para satisfazer a condição 1 de criar objetos fora do pacote.

Agora, com relação à condição 3, não consigo achar uma solução. Se eu coloco private no construtor Alpha(String a), a classe Beta não vai ter acesso à ele (veja que a classe Beta está chamando esse construtor pelo super(a); ) Se eu coloco public, não satisfaz a condição de que objetos alpha deveriam sempre ter o valor “A” na variável String (pois eu poderia chamar o construtor de alpha como, por exemplo Alpha a = new Alpha(“B”);. Caso eu coloque ele como protected eu resolvo o problema da chamada de super pela classe Beta, porém, isso irá me permitir criar um objeto Alpha com o campo “alpha” diferente de “A”!!! (Desde que esteja dentro do mesmo pacote, claro).

Ou seja, acho que esse problema não tem solução! O que vcs acham? Eu errei em algo?

coloca como protected…

Mas se eu coloco como protected eu poderei criar objetos da classe Alpha que não tenham “A” como valor do campo “alpha”. Por exemplo:

[code]
package alpha;

public class OutraClasse{

  A a;

  public OutraClasse(){
        a = new A("B"); //Isso fura a condição 3...
  }

} [/code]

hummm…eu não entendi direito o exercicio mas acho que a única solução é colocar como protected ou public…porq se vc quiser construir um objeto Beta vc tb vai ter que criar um objeto Alpha por isso vc tem que chamar o construtor da superclasse