Popular constantes em sua declaração

Olá pessoal :smiley:

Imagine a seguinte situação…

Uma interface com algumas constantes array:

public interface InterfaceQualquer {

    char[] VETOR_PEQUENO = {'a'};

    int[][] MATRIZ_PEQUENA = {{10},{20},{30}};

}

Uma classe utiliza constantes desta interface:

public class ClasseQualquer {

     public ClasseQualquer() {
            int variavel = InterfaceQualquer.MATRIZ_PEQUENA[0][0];
     }

}

Até ai tudo bem. Mas, se caso preciso declarar uma array constante com muitas dimensões :?: interface não aceita métodos construtores para popular as constantes, mesmo que fosse uma classe, seria necessário (outra classe) instancia-la e chamar o método construtor para que a array seja popula.

O Java não aceita uma estrutura de repetição na declaração de variáveis:

public interface InterfaceQualquer {

    char[] VETOR_PEQUENO = {'a'};

    int[][] MATRIZ_PEQUENA = {{10},{20},{30}};

    //Isto resulta em erro
    char[] VETOR_GRANDE = {
        for(byte i=0; i<100; i++){
            {'a'};
        }
    };

}

Minha dúvida é: Como fazer isto :?: Terei que popular a constante VETOR_GRANDE índice por índice, sem uma estrutura de repetição :?:

Porque não criar uma classe abstracta em vez de interface. Na classe abstracta podes criar construtores, métodos só com assinatura etc…

Sim é uma opção, mas só fará com que a 1º classe concreta derivada da abstrata tenha que implementa-la.

Se fizeres isto:

public abstract class Qualquer {  
  
    char[] VETOR_PEQUENO = {'a'};  
  
    int[][] MATRIZ_PEQUENA = {{10},{20},{30}};  
  
    char[] VETOR_GRANDE = {  
        for(byte i=0; i<100; i++){  
            {'a'};  
        }  
    };  
  
}  

E depois podes utilizar esta classe utilizando a herança.

public class Teste extends Qualquer{

...

Não sei se isto te pode ajudar…

Muito Obrigado pela atenção sealrasegan :smiley:

Mas no caso que estou implementado não haverá herança :wink: E este exemplo resulta em erros no for.

Bem InicianteJavaHenrique para ser uma constante a variavel deve ser declarada como static e final, como a variavel que você está criando é de referência, após ser criada ela não pode referenciar a outro objeto, e o array após instanciado não pode ter seu tamanho modificado, então o que você está fazendo é o seguinte.

public interface InterfaceQualquer { /* Você cria uma instancia de um vetor do tipo char com apenas uma posição * Ou seja você pode modificar o valor da primeira posição a vontade, porém não pode * modificar o tamanho deste vetor, comandos como * VETOR_PEQUENO[0] = 'c' é valido porem * VETOR_PEQUENO = {'c'} é invalido porque você está tetando criar uma nova instancia deste vetor */ char[] VETOR_PEQUENO = {'a'}; // O mesmo se aplica a está matriz int[][] MATRIZ_PEQUENA = {{10},{20},{30}}; }

o que você pode fazer é o seguinte, caso queira atribuir novos valores a um vetor criar uma instancia para ele que não seja totalmente preenchida como no exemplo a seguir

[code]public interface interfaceQualquer {
// vetor de tamanho 1
public static final char[] VETOR_PEQUENO = new char[1];
// matriz 1 por 3
public static final int[][] MATRIZ_PEQUENA = new int[1][3];
// vetor grande
public static final char[] VETOR_GRANDE = new char[100];
}

public class Executavel{

public static void main (String[] args){
    for (int i = 0; i < 100; i++){
        VETOR_GRANDE[i] = 'a';
    }
}

}[/code]

Obrigado pela atenção CharlesAlves :smiley:

Mas, no exemplo que citei acima (interface): veja http://grupohaw.com.br/2009/10/07/regras-de-interfaces-java-3/

Regras das Variáveis (Constantes)
Todas as variáveis de uma interface são public, static e final, sendo assim, todas as variáveis são constantes (toda constante deve ser inicializada);
As declarações public, static e final são opcionais;

Sim, para isto teria que ser um ArrayList por exemplo :smiley:

public interface InterfaceQualquer { /* Você cria uma instancia de um vetor do tipo char com apenas uma posição * Ou seja você pode modificar o valor da primeira posição a vontade, porém não pode * modificar o tamanho deste vetor, comandos como * VETOR_PEQUENO[0] = 'c' é valido porem * VETOR_PEQUENO = {'c'} é invalido porque você está tetando criar uma nova instancia deste vetor */ char[] VETOR_PEQUENO = {'a'}; // O mesmo se aplica a está matriz int[][] MATRIZ_PEQUENA = {{10},{20},{30}}; }

[quote=CharlesAlves]o que você pode fazer é o seguinte, caso queira atribuir novos valores a um vetor criar uma instancia para ele que não seja totalmente preenchida como no exemplo a seguir

[code]public interface interfaceQualquer {
// vetor de tamanho 1
public static final char[] VETOR_PEQUENO = new char[1];
// matriz 1 por 3
public static final int[][] MATRIZ_PEQUENA = new int[1][3];
// vetor grande
public static final char[] VETOR_GRANDE = new char[100];
}

public class Executavel{

public static void main (String[] args){
    for (int i = 0; i < 100; i++){
        VETOR_GRANDE[i] = 'a';
    }
}

}[/code][/quote]

É exatamente isto que quero evitar, ter que criar uma instancia (no caso de uma classe, pois interface não aceita método construtor), gostaria de usar assim interfaceQualquer.VETOR_GRANDE[23] por exemplo.

Mesmo assim muito obrigado