Un uso de la palabra clave var en C # es la declaración de tipo implícita. ¿Cuál es la sintaxis equivalente de Java para var ?
Un uso de la palabra clave var en C # es la declaración de tipo implícita. ¿Cuál es la sintaxis equivalente de Java para var ?
Respuestas:
No hay ninguno. Por desgracia, debe escribir el nombre completo del tipo.
Editar: 7 años después de su publicación, var
se agregó inferencia de tipo para variables locales (con ) en Java 10.
Editar: 6 años después de ser publicado, para recopilar algunos de los comentarios a continuación:
La razón por la que C # tiene la var
palabra clave es porque es posible tener Tipos que no tienen nombre en .NET. P.ej:
var myData = new { a = 1, b = "2" };
En este caso, sería imposible darle un tipo apropiado myData
. Hace 6 años, esto era imposible en Java (todos los tipos tenían nombres, incluso si eran extremadamente verbosos y poco amables). No sé si esto ha cambiado mientras tanto.
var
No es lo mismo que dynamic
. var
Las iables siguen siendo 100% de tipo estático Esto no compilará:
var myString = "foo";
myString = 3;
var
También es útil cuando el tipo es obvio por el contexto. Por ejemplo:
var currentUser = User.GetCurrent();
Puedo decir que en cualquier código del que soy responsable, currentUser
tiene una User
clase o derivada. Obviamente, si su implementación de User.GetCurrent
return an int, entonces quizás esto sea en detrimento de usted.
Esto no tiene nada que ver var
, pero si tiene jerarquías de herencia extrañas en las que sombrea métodos con otros métodos (por ejemplo new public void DoAThing()
), no olvide que los métodos no virtuales se ven afectados por el Tipo con el que se convierten.
No puedo imaginar un escenario del mundo real en el que esto sea indicativo de un buen diseño, pero esto puede no funcionar como se espera:
class Foo {
public void Non() {}
public virtual void Virt() {}
}
class Bar : Foo {
public new void Non() {}
public override void Virt() {}
}
class Baz {
public static Foo GetFoo() {
return new Bar();
}
}
var foo = Baz.GetFoo();
foo.Non(); // <- Foo.Non, not Bar.Non
foo.Virt(); // <- Bar.Virt
var bar = (Bar)foo;
bar.Non(); // <- Bar.Non, not Foo.Non
bar.Virt(); // <- Still Bar.Virt
Como se indicó, los métodos virtuales no se ven afectados por esto.
No, no hay una forma no torpe de inicializar a var
sin una variable real.
var foo1 = "bar"; //good
var foo2; //bad, what type?
var foo3 = null; //bad, null doesn't have a type
var foo4 = default(var); //what?
var foo5 = (object)null; //legal, but go home, you're drunk
En este caso, simplemente hazlo a la antigua usanza:
object foo6;
var p = new X(); p.Z()
no es lo mismo que SuperX p = new X(); p.Z()
para todas las X y SuperX, aunque X : SuperX
. Con var
el tipo estático de p
siempre está X
en el primer ejemplo anterior, pero siempre SuperX
en el segundo ejemplo. Una diferencia sutil pero importante a tener en cuenta. Pero su respuesta es muy correcta :-)
var
no deja el código menos claro. Más bien lo contrario en mi opinión. ¿Por qué, por ejemplo, escribe el tipo dos (o incluso tres) veces en la misma fila cuando lo declara y lo instancia ( RadioButton radioButton = new RadioButton();
)? var
te hace pensar dos veces cuando estás nombrando tus variables porque centra la atención en la funcionalidad en lugar del tipo (por ejemplo, UserCollection collection = new userRepository.GetUsers();
se convierte en algo más natural var users = userRepository.GetUsers();
). Si crees que var
no está claro es porque no está acostumbrado.
var
definitivamente puede dejar bien en claro el código, pero también puede hacer que no esté claro si se usa mal; como muchas opciones de formato. El balance difiere dependiendo de cuánto use objetos anónimos y genéricos, ninguno de los cuales existía en .NET 1.0, lo que lo hace menos útil como una palabra clave hipotética en la primera versión de C♯. Solo nombraría un RadioButton
radioButton
en el caso de un método de fábrica o auxiliar donde lo único significativo sobre el botón era que era un RadioButton
, de lo contrario, eso es una locura con o sin var
.
var
usted como usted, si no más, pero he cambiado de opinión, y tal vez sea tan simple como una cuestión de opiniones diferentes, porque todavía creo que está equivocado cuando dice que es un error. no importa cuánto esté usando objetos anónimos y genéricos;) La declaración de tipo suele ser solo ruido de código, si no puede entender el código sin él, el código probablemente no esté claro en ninguno de los casos.
var
simplemente le pide al compilador que infiera el tipo de la asignación; Es azúcar sintáctico. Al principio era escéptico al respecto, pero lo uso religiosamente y aún no he encontrado un momento en el que haya causado confusión. Elimina la redundancia al crear instancias y elimina la necesidad de verificar el tipo al hacer referencia. No hay equivalente de JAVA a partir de JAVA 9.
Si agrega Lombok a su proyecto, puede usar su palabra clave val .
final
no es necesariamente inmutable. Considerefinal StringBuilder strB = new StringBuilder("My reference is final"); strB.append("I'm not immutable");
var
. projectlombok.org/features/experimental/var.html
JEP - Propuesta de mejora de JDK
http://openjdk.java.net/jeps/286
JEP 286: Inferencia de tipo variable local
Autor Brian Goetz
// Goals:
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
He preparado un complemento para IntelliJ que, en cierto modo, te ofrece var
en Java. Es un truco, por lo que se aplican las exenciones de responsabilidad habituales, pero si usa IntelliJ para su desarrollo de Java y desea probarlo, está en https://bitbucket.org/balpha/varsity .
Con el lanzamiento de JDK 10 el 20 de marzo, Java ahora incluye un var
nombre de tipo reservado (no una palabra clave, ver más abajo) como se especifica en JEP 286 . Para las variables locales, lo siguiente ahora es válido en Java 10 o superior:
var map = new HashMap<String, Integer>();
El var
nombre de tipo reservado en Java es casi idéntico a la var
palabra clave en C #, ya que ambos permiten la escritura implícita (consulte a continuación las diferencias importantes). var
en Java solo se puede usar para la inferencia de tipo implícita en los siguientes contextos (como se enumera en JEP 286: Objetivos ):
Por var
lo tanto , no se puede usar para campos, tipos de retorno, nombres de clase o nombres de interfaz. Su fundamento es eliminar la necesidad de incluir nombres de tipo largos al declarar y definir variables locales, como se indica en JEP 286 (escrito por Brian Goetz):
Buscamos mejorar la experiencia del desarrollador al reducir la ceremonia asociada con la escritura de código Java, al tiempo que se mantiene el compromiso de Java con la seguridad de tipos estáticos, al permitir a los desarrolladores eludir la declaración de manifiesto a menudo innecesaria de los tipos de variables locales.
var
Alcance en JavaCabe señalar que var
no es una palabra clave en Java, sino un nombre de tipo reservado. Como se cita de JEP 286:
El identificador var no es una palabra clave; en cambio es un nombre de tipo reservado. Esto significa que el código que usa var como variable, método o nombre del paquete no se verá afectado; el código que usa var como clase o nombre de interfaz se verá afectado (pero estos nombres son raros en la práctica, ya que violan las convenciones de nomenclatura habituales).
Tenga en cuenta que, dado que var
es un nombre de tipo reservado y no una palabra clave, todavía se puede usar para nombres de paquetes, nombres de métodos y nombres de variables (junto con su nueva función de interferencia de tipos). Por ejemplo, los siguientes son todos ejemplos de usos válidos de var
en Java:
var i = 0;
var var = 1;
for (var i = 0; i < 10; i++) { /* ... */ }
public int var() { return 0; }
package var;
Como se cita de JEP 286:
Este tratamiento se restringiría a variables locales con inicializadores, índices en el bucle for mejorado y locales declarados en un bucle for tradicional; no estaría disponible para formales de método, formales de constructor, tipos de retorno de método, campos, formales de captura o cualquier otro tipo de declaración de variable.
var
en Java y CEsta es una diferencia notable entre var
C # y Java que incluye lo siguiente: var
se puede usar como nombre de tipo en C # pero no se puede usar como nombre de clase o nombre de interfaz en Java. De acuerdo con la documentación de C # (Variables locales escritas implícitamente) :
Si un tipo llamado
var
está dentro del alcance, lavar
palabra clave se resolverá con ese nombre de tipo y no se tratará como parte de una declaración de variable local tipada implícitamente.
La capacidad de usar var
como nombre de tipo en C # crea cierta complejidad e introduce algunas reglas de resolución complejas, que var
Java evita al deshabilitar var
como nombre de clase o interfaz. Para obtener información sobre las complejidades de los var
nombres de tipo en C #, consulte Restricciones que se aplican a las declaraciones de variables escritas implícitamente . Para obtener más información sobre la justificación de la decisión de determinación del alcance de `var en Java, consulte JEP 286: Opciones de determinación del alcance .
var
para campos o tipos de retorno? ¿Por qué es importante tener en cuenta?
var
en Java no se puede usar para campos o tipos de retorno. Esto es importante porque esta restricción hace que sea var
sensible al contexto, donde solo se puede usar en algunos contextos (variables locales) y no en otros. Esto no es necesariamente una diferencia entre Java y C # que debe tenerse en cuenta, pero es una restricción importante en general cuando se usa var
en Java.
var
un nombre de clase y usarlo como tal. Técnicamente es una "palabra clave de contexto" en el caso de c #, pero en Java parece que no puede hacer lo mismo. Corrígeme si me equivoco.
var
como un nombre de clase o un nombre de interfaz en Java (que de todos modos no es común), pero puede usarlo para nombres de variables, nombres de métodos y nombres de paquetes. Por ejemplo, var var = 1;
es una declaración válida de Java, pero tratando de declarar una clase que public class var {}
resulta en un error: as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations
. He actualizado la respuesta anterior para entrar en más detalles sobre la lógica detrás var
de Java y sus diferencias con var
C #.
Se admitirá en JDK 10. Incluso es posible verlo en acción en la compilación de acceso temprano .
El JEP 286 :
Mejore el lenguaje Java para extender la inferencia de tipos a declaraciones de variables locales con inicializadores.
Entonces ahora en lugar de escribir:
List<> list = new ArrayList<String>();
Stream<> stream = myStream();
Usted escribe:
var list = new ArrayList<String>();
var stream = myStream();
Notas:
var
ahora es un nombre de tipo reservadoSi desea probarlo sin instalar Java en su sistema local, creé una imagen Docker con JDK 10 instalado:
$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar 30, 2018 9:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
| Welcome to JShell -- Version 10
| For an introduction type: /help intro
jshell> var list = new ArrayList<String>();
list ==> []
var
) no es equivalente. En el var
ejemplo list
es de tipo ArrayList
, no a List
.
Una solución simple (suponiendo que esté usando un IDE decente) es simplemente escribir 'int' en todas partes y luego configurarlo para usted.
De hecho, acabo de agregar una clase llamada 'var' para no tener que escribir algo diferente.
El código todavía es demasiado detallado, ¡pero al menos no tiene que escribirlo!
int
) - ¿Me estoy perdiendo algo? (*: aunque nunca llamaría a Eclipse un IDE decente, no puedo juzgar por los demás ...)
Java 10 obtuvo inferencia de tipo de variable local, por lo que ahora tiene lo var
que es más o menos equivalente a C # one (que yo sepa).
También puede inferir tipos no denotables (tipos que el programador no pudo nombrar en ese lugar; aunque los tipos que no son denotables son diferentes). Vea, por ejemplo, Trucos con var
clases anónimas (que nunca debe usar en el trabajo) .
La única diferencia que pude encontrar es que en C #,
En Java 10 var
no es un nombre de tipo legal.
A partir del 10 de Java, el equivalente es ... var
.
Sé que esto es más antiguo, pero ¿por qué no crear una clase var y crear constructores con diferentes tipos y dependiendo de qué constructores se invoque, obtienes var con diferentes tipos. Incluso podría incorporar métodos para convertir un tipo a otro.
Lombok
admite var pero todavía está clasificado como experimental:
import lombok.experimental.var;
var number = 1; // Inferred type: int
number = 2; // Legal reassign since var is not final
number = "Hi"; // Compilation error since a string cannot be assigned to an int variable
System.out.println(number);
Aquí hay una trampa que debes evitar cuando tratas de usarlo IntelliJ IDEA
. Parece funcionar como se esperaba, aunque incluye la finalización automática y todo. Hasta que haya una solución "no hacky" (por ejemplo, debido a JEP 286: Inferencia de tipo variable local ), esta podría ser su mejor opción en este momento.
Tenga en cuenta que también val
es compatible Lombok
sin modificar o crear a lombok.config
.
Puede, en Java 10, pero solo para variables locales , es decir,
Usted puede,
var anum = 10; var aString = "Var";
Pero no puedo
var anull = null; // Since the type can't be inferred in this case
Echa un vistazo a las especificaciones para más información.
var
se puede usar para muchas formas de tipos no denotables, incluidos los tipos de captura, los tipos de intersección y los tipos de clase anónimos. Y, a partir de Java 11, también se puede aplicar a los parámetros lambda.
En general, puede usar la clase Object para cualquier tipo, ¡pero debe hacer la conversión de tipos más tarde!
p.ej:-
Object object = 12;
Object object1 = "Aditya";
Object object2 = 12.12;
System.out.println(Integer.parseInt(object.toString()) + 2);
System.out.println(object1.toString() + " Kumar");
System.out.println(Double.parseDouble(object2.toString()) + 2.12);
var
palabra ahora oficialmente en el idioma, su respuesta también se refiere a la forma ya pasada de moda.
Esta característica ahora está disponible en Java SE 10. La var estática y segura de tipos finalmente ha llegado al mundo java :)
fuente: https://www.oracle.com/corporate/pressrelease/Java-10-032018.html
val
(ovar
) si usa un lenguaje particular de "reemplazo de Java" ;-)