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