java - móviles - manual de programacion android pdf
Java: ¿Cuándo es útil un bloque de inicialización estático? (12)
¿Cuál es la diferencia entre la inicialización dentro de un bloque static
?
public class staticTest {
static String s;
static int n;
static double d;
static {
s = "I''m static";
n = 500;
d = 4000.0001;
}
...
Y la inicialización estática individual:
public class staticTest {
static String s = "I''m static";
static int n = 500;
static double d = 4000.0001;
....
Algunas veces desea hacer algo más que simplemente asignar valores a variables estáticas. Como no puede colocar declaraciones arbitrarias en el cuerpo de la clase, puede usar un bloque de inicializador estático.
El bloque de código estático permite inicializar los campos con más de instuction, inicializar los campos en un orden diferente de las declaraciones y también podría utilizarse para la inicialización condicional.
Más específicamente,
static final String ab = a+b;
static final String a = "Hello,";
static final String b = ", world";
no funcionará porque a y b se declaran después de ab.
Sin embargo, podría usar un init estático. bloquear para superar esto.
static final String ab;
static final String a;
static final String b;
static {
b = ", world";
a = "Hello";
ab = a + b;
}
static final String ab;
static final String a;
static final String b;
static {
b = (...) ? ", world" : ", universe";
a = "Hello";
ab = a + b;
}
El manejo de excepciones durante la inicialización es otra razón. Por ejemplo:
static URL url;
static {
try {
url = new URL("https://blahblah.com");
}
catch (MalformedURLException mue) {
//log exception or handle otherwise
}
}
Esto es útil para los constructores que lanzan de manera molesta excepciones comprobadas, como la anterior, o una lógica de inicialización más compleja que podría ser propensa a la excepción.
En tu ejemplo, no hay diferencia; pero a menudo el valor inicial es más complejo de lo que se expresa cómodamente en una sola expresión (por ejemplo, es una List<String>
cuyos contenidos se expresan mejor por un -loop; o es un Method
que podría no existir, por lo que los manejadores de excepciones son necesario), y / o los campos estáticos deben establecerse en un orden específico.
La palabra clave estática (ya sea una variable o un bloque) pertenece a la clase. Entonces, cuando se llama a la clase, estas variables o bloques se ejecutan. Por lo tanto, la mayor parte de la inicialización se realizará con la ayuda de la palabra clave estática. Como pertenece a la clase en sí misma, la clase puede acceder directamente a ella, sin crear una instancia de la clase.
Tomemos un ejemplo: hay una clase de calzado en la que hay varias variables como el color, el tamaño, la marca, etc. ... Y aquí, si la empresa de fabricación de calzado tiene una sola marca, debería inicializarla como una variable estática. Entonces, cuando se llama a la clase de zapatos y se fabrican diferentes tipos de zapatos (al crear una instancia de la clase) en ese momento el color y el tamaño ocuparán memoria cada vez que se cree una nueva zapatilla, pero aquí la marca es una propiedad común para todos los zapatos. para que ocupe la memoria por una vez, sin importar cuántos zapatos se fabriquen.
Ejemplo:
class Shoe {
int size;
String colour;
static String brand = "Nike";
public Shoe(int size, String colour) {
super();
this.size = size;
this.colour = colour;
}
void displayShoe() {
System.out.printf("%-2d %-8s %s %n",size,colour, brand);
}
public static void main(String args[]) {
Shoe s1 = new Shoe(7, "Blue");
Shoe s2 = new Shoe(8, "White");
System.out.println("=================");
s1.displayShoe();
s2.displayShoe();
System.out.println("=================");
}
}
Puede usar el bloque try / catch dentro de static{}
como se muestra a continuación:
MyCode{
static Scanner input = new Scanner(System.in);
static boolean flag = true;
static int B = input.nextInt();
static int H = input.nextInt();
static{
try{
if(B <= 0 || H <= 0){
flag = false;
throw new Exception("Breadth and height must be positive");
}
}catch(Exception e){
System.out.println(e);
}
}
}
PD: ¡derivado de this !
Técnicamente, podrías escaparte sin eso. Algunos prefieren el código de inicialización de líneas múltiples para entrar en un método estático. Me complace usar un inicializador estático para la inicialización relativamente simple de varias instancias.
Por supuesto, casi siempre hago que mi estática sea final
y apunto a un objeto no modificable.
Un bloque de inicialización estática permite una inicialización más compleja, por ejemplo, usando condicionales:
static double a;
static {
if (SomeCondition) {
a = 0;
} else {
a = 1;
}
}
O cuando se requiere algo más que la construcción: cuando se utiliza un generador para crear su instancia, es necesario el manejo de excepciones o el trabajo que no sea la creación de campos estáticos.
Un bloque de inicialización estático también se ejecuta después de los inicializadores estáticos en línea, por lo que lo siguiente es válido:
static double a;
static double b = 1;
static {
a = b * 4; // Evaluates to 4
}
Un bloque de inicialización estático es útil si se quiere inicializar tipos estáticos de clase especificados, antes del primer uso de clase. El uso posterior no invocará ningún bloque de inicialización estático. Es el opuesto directo de los inicializadores de instancias, que inicializan los miembros de la instancia,
Un uso típico:
private final static Set<String> SET = new HashSet<String>();
static {
SET.add("value1");
SET.add("value2");
SET.add("value3");
}
¿Cómo lo harías sin un inicializador estático?
Usamos constructores para inicializar nuestras variables de instancia (variables no estáticas, variables que pertenecen a objetos, no a la clase).
Si desea inicializar variables de clase (variables estáticas) y desea hacerlo sin crear un objeto (los constructores solo pueden invocarse al crear un objeto), entonces necesita bloques estáticos.
static Scanner input = new Scanner(System.in);
static int widht;
static int height;
static
{
widht = input.nextInt();
input.nextLine();
height = input.nextInt();
input.close();
if ((widht < 0) || (height < 0))
{
System.out.println("java.lang.Exception: Width and height must be positive");
}
else
{
System.out.println("widht * height");
}
}
static
bloque static
se puede utilizar para inicializar una instancia de singleton , para evitar el uso del método getInstance()
sincronizado .