Popular constantes em sua declaração

6 respostas
InicianteJavaHenriqu

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 :?:

6 Respostas

S

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

InicianteJavaHenriqu

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

S

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…

InicianteJavaHenriqu

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.

CharlesAlves

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

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';
        }
    }

}
InicianteJavaHenriqu

Obrigado pela atenção CharlesAlves :D

CharlesAlves:
Bem InicianteJavaHenrique para ser uma constante a variavel deve ser declarada como static e final...

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;

CharlesAlves:
...e o array após instanciado não pode ter seu tamanho modificado...

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

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}};
}
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
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';
        }
    }

}

É 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

Criado 9 de março de 2012
Ultima resposta 10 de mar. de 2012
Respostas 6
Participantes 3