Java - Final
Concepto
-
Palabra reservada
-
Se usa para definir una
entidadque solo se puede asignar una vez -
Una vez que se ha asignado una variable
finalsiempre tendrá el mismo valor -
Si una
variable finalcontiene una referencia a un objeto entonces el estado del objeto puede cambiar mediante operaciones en el objeto pero la variable siempre se referirá al mismo objeto-
Propiedad se llama
no transitividad -
Se aplica también a los
arrayporque objetos- Si una
variable finalcontiene unareferenciaa unamatrizlos componentes de lamatrizpueden cambiarse mediante operaciones en lamatrizpero la variable siempre se referirá a la mismamatriz
- Si una
-
Usos de Final
Atributos Finales
-
Las variables finales (
atributosy (parámetros) sólo pueden ser inicializadas una vez- Si la variable final es una
referenciaa un objeto esta variable no se podrá referenciar con otroobjeto
- Si la variable final es una
-
Se pueden cambiar los datos dentro del
objetopero no podemos hacer queapunteaotro objeto
public void restar(final int a , final int b){
// Produce un error en tiempo de ejecución
a -= b;
}
Variables Final
-
Solo se puede
inicializaruna vez a través-
De un inicializador
-
Declaración de asignación
-
No es necesario que se inicialice en el punto de declaración
- Se denomina variable
'final en blanco'→blank final
- Se denomina variable
-
-
Variable de instancia'final en blanco'- De una
clasedebe asignarse en cadaconstructorde laclaseen la que se declara
- De una
-
Una
variable estática'final en blanco'- Asignarse en un
inicializador estáticode laclaseen la que se declara sino se produce unerrorentiempo de compilación
- Asignarse en un
-
Si la
variable es una referencia-
La
variableno se puede volver a vincular para hacerreferenciaa otroobjeto -
El
objetoal que hacereferenciaesmutablesi lo era antes
-
-
Constantes finalesen mayúsculas utilizando guiones bajos para separar las palabras
Ejemplo : Clase y Atributos Final
public class Sphere {
// PI es una constante universal, todo lo constante que puede ser algo.
public static final double PI = 3.141592653589793;
public final double radius;
public final double xPos;
public final double yPos;
public final double zPos;
Sphere(double x, double y, double z, double r) {
radius = r;
xPos = x;
yPos = y;
zPos = z;
}
-
Cualquier intento de reasignar el radio
xPos,yPosozPosdará como resultado un error de compilación. -
Si el
constructorno establece unavariable finalintentar establecerla fuera del constructor generará un error de compilación. -
Si reemplazamos las tres variables de posición con una sola
public final Position pos;
-
Donde
poses un objeto con tres propiedadespos.x,pos.yypos.z -
Entonces
posno se puede asignado pero las tres propiedades sí a menos que seanfinalesen sí mismas
Clases Final
-
Evitando que estas puedan ser heredadas
extends
- No se pueden
extendera otrasclases hijas- No permiten
crear subclasesa partir de unaclase final
- No permiten
-
Métodos-
Evitando que estos puedan ser sobrescritos
@Override
-
-
Atributos o Variables-
Para crear
CONSTANTESpublic static final double PI = 3.14159265358979323849
-
Métodos Final
-
No pueden ser
@Overridepor ninguna de sus subclases -
Una
clase finalno puede crearsubclaseso claseshijas-
Se utiliza para obtener seguridad y eficiencia
-
Algunas clases de la biblioteca estándar de Java son
finalesjava.lang.Systemyjava.lang.String
-
-
-
Las
subclasesno pueden anular ni ocultar unmétodo final- Se utiliza para evitar comportamiento inesperado de una
subclaseque altera unmétodocrucial para lafuncióno la consistencia de unaclase
- Se utiliza para evitar comportamiento inesperado de una
-
Error declarar un método
finalpara mejorar la eficiencia al permitir que el compilador inserte directamente el método cuando se invoque
Bucle For : Final
- la siguiente es una declaración legal
for (final SomeObject obj : someList) {
// hacer algo con el objeto
}
- La
variable objse vuelve a declarar en cada iteración lo que permite usar el mismotokeno el mismoobjpara representarmúltiples variables
Variables finales en objetos anidados
-
Las
variables finalesse pueden utilizar paraconstruirárboles deobjetos inmutables- Construidos se garantiza que estos objetos no cambiarán más
-
Clase inmutablesolo debe tenercampos finalesy estoscampos finalessolo pueden tenertipos inmutables -
Tipos primitivosde Java soninmutablesal igual queStringy algunasclases -
Si la construcción anterior al tener un objeto en el árbol que no es inmutable, la expectativa no se cumple de que todo lo que se pueda alcanzar a través de la variable final sea constante
Ejemplo
-
Código define un sistema de coordenadas cuyo origen siempre debe estar en
(0, 0)- El origen se implementa utilizando
java.awt.Pointy esta clase define suscamposcomopúblicosymodificables
- El origen se implementa utilizando
-
Al llegar al
objeto de origena través del acceso con solovariables finaleseseobjetopuedemodificarse
import java.awt.Point;
public class FinalDemo {
static class CoordinateSystem {
private final Point origin = new Point(0, 0);
public Point getOrigin() {
return origin;
}
}
public static void main(String[] args) {
CoordinateSystem coordinateSystem = new CoordinateSystem();
coordinateSystem.getOrigin().x = 15;
assert coordinateSystem.getOrigin().getX() == 0;
}
}
-
Declarar una
variable finalsignifica que estavariable apuntaráalmismo objetoen cualquier momento- El
objetoal queapuntalavariableno estáinfluenciadopor esavariable final
- El
-
El ejemplo anterior las coordenadas
xeydel origen se pueden modificar -
Requisito común es que todos los campos de un
objeto inmutabledeben serfinalesy que lostiposde estoscamposdeben serinmutables -
Esto descalifica
java.util.Dateyjava.awt.Pointvariasotras clasespara que no se utilicenobjetos inmutables
Clases Internas y Final
-
Cuando se define una
clase interna anónimadentro delcuerpode unmétodotodas lasvariables declaradas finalesen el alcance de esemétodoson accesibles desde dentro de laclase internas- Para valores de objeto la
referenciano puede cambiar
- Para valores de objeto la
import javax.swing.*;
public class FooGUI {
public static void main(String[] args) {
//inicializa componente GUI
final JFrame jf = new JFrame("Hello world!"); //permite acceder a jf desde el cuerpo interno de la clase
jf.add(new JButton("Click me"));
// Empaquetar y hacer visible en el hilo de envío de eventos 'Event-Dispatch'
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jf.pack(); //esto sería un error de compilación si 'jf' no fuera final
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
});
}
}
Final en blanco - Blank Final
-
Variable finalcuya declaración carece deinicialización -
Solo se puede asignar una vez y debe estar desasignando cuando ocurre una
asignación
final boolean hasTwoDigits;
if (number >= 10 && number < 100) {
hasTwoDigits = true;
}
if (number > -100 && number <= -10) {
hasTwoDigits = true; // error de compilación porque la variable final podría estar ya asignada.
}
- También debe asignar definitivamente un
final en blanco→blank finalantes de acceder
final boolean isEven;
if (number % 2 == 0) {
isEven = true;
}
System.out.println(isEven);
- Tenga en cuenta que una
variable localnofinaltambién debe asignarse definitivamente antes de acceder a ella
boolean isEven; // *no* final
if (number % 2 == 0) {
isEven = true;
}
System.out.println(isEven); // Mismo error de compilación porque la variable no final no fue asignada en el caso else.
Deja un comentario