Pregunta Cadena privada o cadena pública estática?


En mi pasantía, uno de mis colegas me dio una pista. Quiero saber si esto es una buena práctica.

Lo que estaba haciendo era crear clases que se usan solo para los valores que contienen y no tienen ninguna función que realmente haga algo (aparte de tener getters, setters y un constructor). Declaré mis variables así:

public class ObjectIUse{
  Private String name;

  public ObjectIUse(String name){
    this.name = name;
  }

  public String getName(){
    return name;
  }
}

Así que no estoy usando un setter porque siempre debería ser el mismo. Mi colega dijo que también puedo hacerlo de esta manera:

public class ObjectIUse{
  public final String name;

  public ObjectIUse(String name){
    this.name = name;
  }
}

Porque ahora no necesitamos tener getters o setters porque es público, sin embargo, tampoco puede cambiarse porque es definitivo.

¿Cuál sería mejor? ¿O tal vez sería preferible hacerlo privado pero también definitivo? Quiero decir que todas las opciones funcionan, obviamente. Solo quiero saber qué es mejor y por qué.


8
2018-03-28 12:46


origen


Respuestas:


Haga la variable privada, porque al hacerlo estará encapsulando la variable en tu clase. Esto tiene muchos beneficios, ocultación de información está entre uno, que aprenderá si va al enlace de arriba.

Si desea que nunca cambie después de la creación, hágalo también definitivo.


7
2018-03-28 12:49



Esto funciona ahora porque String es inmutable Pero, ¿qué sucede cuando expones la referencia a una clase mutable y esa clase no es segura para subprocesos? Ni siquiera puedes devolver un copia defensiva si quieres.

Sin mencionar que esto también rompe la encapsulación. Use una variable privada y getters.


4
2018-03-28 12:53



La idea de no proporcionar un método setter a una variable lo convierte en un campo de solo lectura, dicho eso, significa que solo podemos leer pero no escribir, por lo que es una constante mediante el uso del final la palabra clave lo resume todo.

Creo que una constante es mejor. final palabra clave mejora el rendimiento. Lee mas aquí


1
2018-03-28 12:50



Definitivamente debe tener un getter y hacer que su campo sea privado. Eso es lo que llamamos encapsulación.

También al hacer que sea definitiva y no tener un setter, su objeto es inmutable, lo cual es muy bueno para la programación paralela.


1
2018-03-28 12:50



Un uso adecuado del principio de encapsulación es hacer todos los campos de clase privados y acceder a ellos a través de instaladores y getters. Aparte de eso, es posible que desee agregar cualquier lógica adicional cuando llame getName(). Mientras que la segunda variante se usa a veces, la primera es mejor. Espero que esto ayude.


1
2018-03-28 12:51



¿Cuál sería mejor? O tal vez sería preferible seguir haciendo   es privado pero también final?

Si quiere ser un desarrollador exitoso, debe programar de manera correcta, eficiente y segura. La seguridad y el rendimiento están en primer lugar.

Cuando lo hagas público, romperás encapsulación eso es muy importante y tiene muchos beneficios. Cada vez que desee obtener una propiedad de Object, los getters se convertirán en su amigo.

En general, no debería tener acceso directo a las propiedades de Object (solo en casos extremos, pero también se pueden resolver de una mejor manera). Getters y Setters se designan para estos fines: preserva la encapsulación y trata los objetos de forma segura.

final variablesgeneralmente se usan para datos que no se pueden cambiar durante un tiempo.


1
2018-03-28 12:49



Creo que su razonamiento es que tenerlo public mantiene el código más simple. Se critica a Java por ser demasiado detallado en situaciones como esta. En un lenguaje como Javascript donde esto (normalmente) siempre sería public.

Pero esa simplicidad es una compensación contra tener un código seguro, estable y extensible.

Para ver por qué es importante, eche un vistazo a un proyecto de Javascript a gran escala que se ha escrito con todo como público. El código de cada clase puede ser simple ... pero sus relaciones, y la arquitectura resultante, terminan siendo una pesadilla para mantener.


1
2018-03-28 12:59



Creo que es depende. Por ejemplo: si usa getter, puede anularlo. A veces es muy útil.


0
2018-03-28 13:06