"CONST" en Java

Tengo una pregunta sobre "CONST" en Java.

Quiero saber cómo hacer como "const struct VAL & getVal ()" en lenguaje C.

Aquí hay un código de muestra.

public class test {
   /* VAL is just structure-like class */
   class VAL {
    public int i;
   };
   private VAL  val;

   /* test class functions */
   test() {
    val = new VAL();
    val.i = 1;
   }

   VAL getVal() {
    return val;
   }

   /* main function */
   public static void main(String[] args) {
    test t = new test();
    VAL  t_val;

    t_val = t.getVal();

    t_val.i = 2; /* it should be error if t_val variable is a const */
    System.out.printf("%d %d\n", t.getVal().i, t_val.i);
   }
}

a continuación se muestra el código de muestra C.

struct VAL
{
    int i;
};

const struct VAL &getVal() /* THIS IS WHAT I WANT */
{
    static VAL xxx;
    return xxx;
}

int main()
{
    const VAL &val = getVal();
    val.i = 0; /* error */

    VAL val2 = getVal();
    val2.i = 0; /* it's not an error, but it's ok because it cannot be changed xxx variable in getVal() either. */

    return 0;
}
Respuesta 1

no puede hacer exactamente lo mismo que en C. Aunque use la finalpalabra clave, solo evita la modificación de la referencia de variable. t_val.i = 2será un error si se declara como atributo final.

Respuesta: 2

const struct VAL & getVal () / * ESTO ES LO QUE QUIERO * /

No existe tal construcción en Java, a pesar de todas las respuestas en sentido contrario, y especialmente aquellas que sugieren la palabra clave 'final'.

Respuesta: 3

Un mejor enfoque es usar enum. Son muy poderosos. Puede usarlo en la instrucción switch y puede tener propiedades internas según lo necesite con struct. Puede buscar documentación en http://download.oracle.com/javase/tutorial/java/javaOO/enum.html .

Respuesta: 4

La respuesta corta es que no puedes, al menos no en un sentido general. Usted PUEDE si usa todas las primitivas (o clases que crea que son todas primitivas), y un número muy pequeño de clases (String me viene a la mente), pero NO PUEDE hacerlo en un sentido general ya que no tiene control sobre lo que hace la gente con tus objetos después de llamar al método getter. Si quieres hacer esto, tienes 2 opciones:

  1. Haga que todos sus CAMPOS (no su clase, sus CAMPOS, en este caso i) sean finales, de esa manera la gente no puede cambiarlos.

  2. Haga que todos sus campos sean privados y no cree setters públicos (este es el método preferido)

Sin embargo, volviendo a mi punto original:

Supongamos que val se definió así:

public class VAL {
        private List<Integer> i=new ArrayList<Integer>();
        public VAL() {
            i.add(3);
         }
        public List<Integer> getI() {return i;}
       };

Ahora nadie puede venir y cambiar el objeto al que apunta su lista, pero pueden cambiar muy bien lo que estoy señalando, pero un código como este es perfectamente válido (y es válido incluso si estoy marcado como final):

VAL bob=new VAL();
System.out.println(bob.getI().size());
bob.getI().clear();
System.out.println(bob.getI().size());

El código anterior imprimirá 1 0

Lo que significa que aunque no cambié, el contenido de su lista sí ........

Respuesta: 5

comenzando con Java y me he encontrado con algunos problemas. He creado una clase llamada: Admin, a la que un usuario le dará atributos como un nombre y otra información de pedigrí ... pero la función principal de ...

Estoy buscando una herramienta, una tarea ant, el complemento IDE, ... que ayuda con I18N de una aplicación Java que utiliza los paquetes de recursos de propiedades de mensaje estándar. Tanto las soluciones de código abierto como las comerciales son ...

Para fines de evaluación comparativa, me gustaría que un SecureRandom produzca resultados deterministas. ¿Es esto posible mediante el uso de una semilla (o tal vez la especificación de un algoritmo)? import java.security ....

Estoy usando NetBeans 6.8, Tomcat 6 y Maven 2.2 y quiero ver los cambios en mi código inmediatamente en el navegador (que muestra http: // localhost: 8080) después de guardar el archivo. El tomcat-maven-plugin tiene el ...