logo le blog invivoo blanc

Les modificateurs d’accès

18 septembre 2019 | Java | 0 comments

En java, la mise en application du concept d’encapsulation est possible en parti grâce aux modificateurs d’accès. En effet, ils nous permettent de définir la visibilité, la portabilité et l’intégrité des données traitées.

1. Quels sont les différents niveaux d’accès en java ?

En java, il existe quatre niveaux d’accès, appelés aussi « access modifiers » en anglais : public, protected, private et package (non défini, accès par défaut).

2. A quoi sert le mot clé “static” ?

  • « static » sur un attribut :
    • Un attribut déclaré « static », également appelé attribut de classe, est indépendant des objets instanciés et pourrait servir à partager des informations entre les instances de cette classe. Par conséquent, pour y accéder on n’aura pas besoin au préalable d’instancier un objet de la classe concernée. Cependant l’accès sera conditionné par le niveau de sécurité qui lui est attribué.

Exemples :

  • Un compteur d’instances pour connaître le nombre d’objets qui ont été créés.
  • La liste des objets (d’une classe) instanciés depuis l’exécution du programme.
  • Des paramètres constants dans une classe utilitaire (messages d’erreur…).
  • « static » sur une méthode (de classe) :
    • Une méthode déclarée « static » est également indépendante des objets de la classe dans laquelle elle est définie. Son accès ne nécessite donc pas une instanciation au préalable mais dépend quand même du niveau de visibilité.

Exemples :

  • Outils (Opérations entre instances, opérations annexes…).
  • Aussi utilisé dans le cadre de l’implémentation d’un « Singleton ».

A retenir :

  • On appelle également les variables/méthodes « static » variables/méthodes de classe.
  • Une méthode « static » ne peut pas utiliser des variables d’instances (non « static » / liées aux objets).
  • Une méthode « static » ne peut pas faire appel à une méthode non « static ».

3. Pourquoi utilise-t-on le mot clé “final” ?

  • « final » sur une classe :

Une classe déclarée « final » ne pourra pas être héritée par d’autres classes. Le développeur peut décider d’empêcher qu’une classe soit héritable pour des raisons de sécurité, d’efficacité et de stabilité du comportement de son code.

Exemples : string (« java.lang.string »), system (« java.lang.system ») …

Syntaxe : « access_modifier » final class nomdelaclasse {…}

  • « final » sur une méthode :

Une méthode déclarée « final » ne pourra pas être redéfinie ou cachée avec le mot-clé static dans les sous-classes de la classe dans laquelle elle est définie.

Exemple : public final void nomDeLaMethode(…) {…}

  • « final » sur une variable :

Une variable déclarée « final » ne peut plus être réassignée. Cependant, il faut savoir qu’il est toujours possible de modifier ses attributs si des accesseurs le permettent.

public static void main(String[] args) {
	final Vehicule v1 = new Vehicule("JAGUAR") ;
	System.out.println(v1);
	v1.setMarque("BMW") ; // COMPILE !
	System.out.println(v1);
}
[Vehicule] Ordre : 1 Marque : JAGUAR
[Vehicule] Ordre : 1 Marque : BMW

A retenir :

  • Une méthode/variable peut être déclarée « static » et « final » à la fois.
  • Une variable de classe déclarée « static » et « final » est essentiellement une constante.
  • On ne peut pas redéfinir les méthodes « final ».
public class MainExplaination {

	public static void main(String[] args) {
		final Vehicule v1 = new Vehicule("JAGUAR") ;
		v1 = new Vehicule("BMX") ; // DO NOT COMPILE !!!
	}
}

4. A quoi sert le mot clé “transient” ?

L’utilisation du mot-clé « transient » est liée au concept de sérialisation en java et permet de ne pas enregistrer la valeur d’un attribut lors de la sauvegarde de l’état d’un objet. En pratique, les attributs déclarés « transient » contiennent des données privées (mot de passe…) ou qui peuvent être calculées sur la base d’autre valeur.

Exemple :

package invivoo;

import java.io.Serializable;

public class User implements Serializable {

	private String login ;
	
	// For more security, we don't save the password. 
	private transient String pwd ;	
	
}

Remarques :

  • Le mot-clé « transient » n’a aucun impact sur les attributs déclarés « static » car ces derniers ne font pas partie de l’état de l’objet correspondant mais plutôt à la classe.
  • Le mot-clé « transient » n’a également pas d’impact sur les attributs déclarés « final » car ces derniers sont directement sérialisés par leurs valeurs par défaut.

5. Que permet le mot clé “volatile” ?

Dans un contexte Multithread, on déclare une variable « volatile » si elle est susceptible d’être lue/modifiée (de manière asynchrone) simultanément par plusieurs threads. En effet, la JVM se charge de rafraîchir sa valeur à chaque fois qu’elle est utilisée pour permettre à tous les threads d’accéder à sa plus récente valeur.

6. Que permet le mot clé “Synchronized” ?

Le mot-clé « synchronized » est utilisé, dans un contexte multithread en java, afin d’éviter un conflit concurrentiel lorsque deux ou plusieurs threads essayent de mettre à jour en même temps des ressources partagées.

En effet, un verrou est posé sur le paramètre de synchronisation ou lock et l’accès au bloc requiert une clé : seul le thread qui détient cette clé peut entrer dans le bloc synchronisé et la clé est rendue à la sortie.

Le paramètre de synchronisation diffère selon la manière d’utilisation :  

  • Sur une méthode de classe :  le paramètre de synchronisation est la classe dans laquelle la méthode est définie : « LaClasse.class »
  • Une méthode d’instance : le paramètre de synchronisation est l’instance dans laquelle on se trouve : « this »
  • Un bloc de codes : dans ce cas, le paramètre de synchronisation est explicitement défini.
package invivoo;

public class DemoSynchro {

	private Object lock = new Object() ;
	
	// Use on static method
	// synchronized on : DemoSynchro.class
	public synchronized static void synchronizedStaticMethod(){
		
	}	
	
	// Use on non-static method
	// synchronized on : this
	public synchronized void synchronizedNonStaticMethod(){
		
	}
	
	
	public int synchronizedBlock(){
		
		// Use on a bloc
		// synchronized on Object ‘lock’
		// We could also use 'synchronized' on the instance 'this': step 2		
		synchronized(lock){
			// ...
		}		
		return 1 ;
	}
}

NB : On dit qu’un bloc (ou méthode) est thread-safe s’il est protégé de tout accès concurrentiel pouvant induire à un conflit.

Bravo, vous êtes maintenant prêt à concevoir un modèle de données fiable ! Encore une fois, la maîtrise des modificateurs d’accès est très importante pour les évaluateurs car elle est essentielle à la bonne définition de votre modèle. Cela vous permettra de mieux contrôler l’utilisation qui sera faite de vos objets et de leurs propriétés. J’espère que cet article vous y aidera, n’hésitez pas à me faire part de vos retours dans les commentaires.

N’oubliez pas de jeter un coup d’oeil sur les deux articles précédents pour être fin prêt pour un entretien technique Java : Introduction au concept de POO en java et Zoom sur l’héritage, l’encapsulation, la surcharge et le polymorphisme