2010-04-23 21 views
14

En C#, puede usar las propiedades para hacer que un campo de datos sea de acceso público (lo que permite al usuario acceder directamente a él) y aún así conservar la capacidad de validar datos en los campos a los que se accede directamente. Java tiene algo similar? Por ejemplo, supongamos que existe una clase C# con la siguiente aplicación (ver más abajo):¿Java tiene "propiedades" que funcionan de la misma manera que las propiedades funcionan en C#?

public class newInt{ 

    public newInt(){...} 

    public int x{ 
     get{ return this.x } 
     set{ this.x = isValid(value) } 
    } 
} 

private static int isValid(int value){...} 

Esta definición de la clase permite al usuario "naturalmente" utilizar el campo de datos 'x' cuando se recuperan los valores de la misma y asignándole valores A continuación se muestra cómo se usaría en main.

public class Test{ 

    public static void main(String[] args){ 

     newInt a = new newInt(); 
     a.x = 50; 

     int b = a.x; 
    } 
} 

La pregunta es ... ¿puede Java hacer esto también? si es así, ¿cómo se llama?

+0

[lombok] (http://projectlombok.org/) podría ayudarlo de alguna manera, aunque no la sintaxis de la propiedad, hace que tratar con getters/setters sea mucho más fácil. – Zabba

Respuesta

16

Es por eso que Java tiene getters/setters.

En C# que por lo general tienen algo como:

public class SomeObject 
{ 
    private string _title = ""; 

    public string Title { get { return _title; } set { _title = value; } } 
} 

// Or with Auto-Properties 
public class SomeObjectAutoProperties 
{ 
    public string Title { get; set; } 
} 

El Java captador/definidor equivalente sería:

public class SomeObject 
{ 
    private String _title = ""; 

    public string getTitle() { return _title; } 

    public void setTitle(String value) { _title = value; } 
} 
+11

En C# moderno es más probable que tengas 'public string Title {get; conjunto; } ':) –

+5

@Jon Muy cierto. Pensé en usar auto-propiedades, pero quería mostrar el campo privado de respaldo para que hubiera un análogo de Java. –

+0

Realmente tengo problemas para entender qué tiene de bueno 'propiedades automáticas' cuando lo hacen los atributos públicos. Quiero decir, si no agrega ninguna validación, y la 'propiedad' ya es pública, ¿por qué no usar mejor:' public string Title; '? – OscarRyz

4

Nop, utilizaría métodos getter y setter lugar. Esta es una convención de Java.

public class newInt { 

    public newInt() {...} 

    private int _x = 0; 

    public int getX() { 
     return this._x; 
    } 

    public void setX(int x) { 
     this._x = isValid(x); 
    } 
} 
2

No. Java no tiene propiedades. La expresión de Java es usar un mutador/acceso (getter/setter). Aunque mucha gente está a favor de agregarlos, es poco probable que se incluyan en la próxima versión (Java 7).

Curiosamente, JavaFX tiene propiedades.

Tenga en cuenta que cuando Java nació tomó prestada una gran cantidad de ideas de C++. Por lo tanto, algunas de las sintaxis y modismos son muy similares a ese lenguaje.

+1

Y asimismo C# prestado de Java y Smalltalk :) Ohh qué preciosos ciclos tienes – xximjasonxx

3

Existe la plataforma Java, y está el lenguaje Java.

El lenguaje Java no admite propiedades (y probablemente nunca lo hará), pero no está obligado a utilizar el lenguaje Java para trabajar con la plataforma Java (así como no necesita adherirse a C# para trabajar con plataforma .NET).

Comprobar:

y muchos otros.

1

No, no tiene.

Realmente tengo un pequeño problema para entender estas propiedades de C#, porque, creo que una de las reglas es realizar el menor código posible en ellas y dado que ya son públicas, ¿por qué no usar atributos públicos? ¿en lugar?

lo tanto, su equivalente en Java (y probablemente feo) sería:

public class NewInt { // In Java class names start with uppercase by convention 
    public int x; 
} 

Y usarlo como:

NewInt ni = new NewInt(); 
ni.x = 50; 
int b = ni.x; 

Hay algo que me falta eso es seguro, pero, la mayoría de las veces esto sería hacer (por cierto nunca código como el siguiente: P)

Por cierto

Realmente no me gustan los getters y setters, pero los acepto como parte de las convenciones de Java.

acabo gustaría que haya usado este lugar:

public class NewInt { 
    private int x; 
    public int x(){ 
     return this.x; 
    } 
    public void x(int value) { 
     this.x=value; 
    } 
    } 

Por lo tanto el uso hubiera sido:

NewInt a = new NewInt(); 
    a.x(10); 
    int b = a.x(); 

Es probable que en la próxima vida de Java.

+0

propiedades no son equivalentes a campos públicos, ya que acceder o mutar un valor de propiedad en C# se puede hacer como una llamada a método. Puede incluir otro código al obtener o establecer un valor de propiedad. – serg10

+0

Una ventaja de usar propiedades C# o getters y setters (incluso si no se pone ningún código en ellos) es que: tiene la opción de agregar código sin cambiar ningún código que dependa de su API. – Rn222

Cuestiones relacionadas