Sysena

Tag: Java

Installation JDK 7 Oracle sur debian 6 (squeeze) via un dépot

by on oct.28, 2012, under Java, Systeme

Depuis que les JRE/JDK Oracle ne peuvent plus être packagé librement, il est devenu moins pratique d’installer un JDK sur debian.
Un PPA maintenu par webupd8 permet de remédier à ce problème. Voila comment procéder :

su -
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
apt-get install ca-certificates
apt-get update
apt-get install oracle-java7-installer
exit

Source : http://www.webupd8.org/2012/06/how-to-install-oracle-java-7-in-debian.html

Leave a Comment :, , more...

Accessibilité en java, pour faire de belles API

by on avr.30, 2010, under Java

Il est recommandé dans tout programme, de réduire la portée (scope) des méthodes, variables, et classes au niveau le plus faible possible, afin de fournir des API solides, ou il est plus difficile de commettre des erreurs.

Portée (scope)

Portée des méthodes

Il existe 4 façons d’acceder à une méthode avec des scopes plus ou moins large :

Portée des méthodes
publicpublic method() {}Rend la méthode accessible depuis n’importe quelle classe
protectedprotected method() {}Rend la méthode uniquement accessible à la classe contenant la méthode, et à ses classes dérivés (classe « fille »)
privateprivate method() {}Rend la méthode accessible uniquement à la classe contenant la méthode
« friendly »method() {}Rend la méthode accessible uniquement aux classes du même package

Pour les méthodes public, protected et friendly, pensez à ajouter le mot clé « final », si vous souhaitez pas que ces méthodes puissent être surchargé.

Portée des variables

La portée des variables d’instances a un fonctionnement similaire à celle des méthodes. Au moyen des mots clés public, protected, et private, ainsi que l’absence de mot clé, on réduit la portée d’une variable d’instance.

Portée des variables
publicpublic Object objectRend la variable accessible depuis n’importe quelle classe
protectedprotected Object objectRend la variable accessible uniquement à la classe, et à ses classes dérivés (classe « fille »).
privateprivate Object objectRend la variable accessible uniquement à la classe.
« friendly »Object objectRend la variable accessible uniquement aux classes du même package

D’une façon générale, il vaut mieux éviter de déclarer des variables « public », l’utilisation d’un accesseur (get/set) étant plus approprié. Néanmoins, cela peut être utile, si vous souhaitez créer des classes assimilables aux structures du C/C++. Pour cet usage, on préfèrera l’usage de la classe « Properties » qui permet de stocker facilement des key/values, sans ambiguïté si la clé n’existe pas / n’a pas été initialisé.

Portée des classes

Ce point la, pourtant essentiel est souvent oublié.

Il existe 2 types de classe : les classes « standard » et les classes imbriquées (nested class). Ces dernières comme l’indiquent leurs noms sont des classes à l’intérieur d’autres classes.

Classes standard

Portée des classes
publicpublic class MyClass {}Rend la classe accessible à tous les packages
« friendly »class MyClass {}Rend la classe accessible uniquement aux classes du même package.

Les classes sont généralement déclarés public, afin de pouvoir etre instancié partout. Il est pourtant possible de les déclarer sans mot clé afin de réduire le scope de la classe à son package. L’interet est majeur, pour fournir des API packagées, avec des classes internes, que l’utilisateur ne pourra pas étendre, et donc éviter des comportements inattendu.

Classes imbriquées (nested class)

Il existe 2 sous catégories aux classes imbriqués : les classes imbriquées statiques (static nested class), et les classes imbriquées non statiques (inner class). Les static nested class fonctionnent exactement comme une classe standard, et ne peuvent accéder aux variables d’instances de la classe la contenant (=> à eviter).

Portée des classes imbriquées non statiques
publicpublic class MyClass {}Rend les instances de la nested class manipulable dans toutes les classes
protectedprotected class MyClass {}Rend les instances de la nested class manipulable dans toutes les classes du meme package (une petite bizarrerie …)
privateprivate class MyClass {}Rend les instances de la nested class manipulable uniquement dans la classe la contenant
« friendly »class MyClass {}Rend les instances de la nested class manipulable dans toutes les classes du meme package

Les inner class se rapportent toujours à l’instance de la classe contenant l’inner class. Elles sont donc liés à l’état des autres variables de l’instance qui a permis d’initialiser l’inner class. (Il est impossible d’instancier une inner class sans qu’elle se rapporte à sa classe mere. L’instanciation en dehors de la classe mere se fait de la façon suivante : « InnerClass motherClass.new InnerClass(); », L’objet motherClass correspondant à une instance de la classe contenant InnerClass).

___

Voila, ce petit post avait surtout pour but de souligner qu’il est possible de réduire la visibilité d’une classe, et pas seulement de variable et méthode. Il est important également de founir des interfaces plutôt que des classes à l’utilisateur final, au moyen de factory, mais cela fera l’object d’un autre post !

Maintenant, à vous de founir des API de qualité en réduisant toujours au strict nécessaire la visibilité de vos classes, méthodes et variables ! :)

Leave a Comment :, more...

Héritage multiple en Java

by on déc.17, 2009, under Java

Bon, évidement, tout le monde sait qu’on ne peut pas faire d’héritage multiple en Java :o

Néanmoins, on peut quand meme contourner ça de façon élégante, pour peu qu’on ai pas à partager de variable d’instance entre nos 2 classes mères. (notez que les 2 classes « Abstract » ne sont pas abstract pour simplifier l’exemple ;) )

Voila un petit exemple tout balo sur comment s’y prendre.

public interface InterfaceA {
	public void methodA1();
	public void methodA2();
}
public interface InterfaceB {
	public void methodB1();
	public void methodB2();
}
public class AbstractA implements InterfaceA {
	@Override
	public void methodA1() {
		System.out.println("AbstractA#methodA1");
	}
	@Override
	public void methodA2() {
		System.out.println("AbstractA#methodA2");
	}
}
public class AbstractB implements InterfaceB {
	@Override
	public void methodB1() {
		System.out.println("AbstractB#methodB1");
	}
	@Override
	public void methodB2() {
		System.out.println("AbstractB#methodB2");
	}
}
public class ClassC implements InterfaceA, InterfaceB {
	AbstractA a = new AbstractA();
	AbstractB b = new AbstractB();
	@Override
	public void methodA1() {
		a.methodA1();
	}
	@Override
	public void methodA2() {
		a.methodA2();
	}
	@Override
	public void methodB1() {
		b.methodB1();
	}
	@Override
	public void methodB2() {
		b.methodB2();
	}
}


Apres, on va dire, ouééééé, mais bon, pourquoi ne pas simplement faire un getter / setter dans la « ClassC », sur les 2 classes « Absract ». Question de gout, mais si vous voulez du pseudo héritage multiple, y’a pas d’autre solution :)

public interface InterfaceA {
public void methodA1();
public void methodA2();
}
Leave a Comment :, more...

Java Web Start – Noms des archis

by on oct.11, 2009, under Java

Pour des applications embarquant des libs spécifique à une archi, il est nécéssaire d’indiquer l’OS et l’architecture correspondant à tel ou tel JAR.

Malheureusement, ce n’est pas très standardisé à l’heure actuelle. Ainsi, sous windows x64 ou linux x64 les noms peuvent différer.

Voici une petite liste pour les cas les plus courant :

Noms des archis
Archix86 (32bits)x86_64 (64bits)PPC
Windowsos=”Windows” arch=”x86″os=”Windows” arch=”x86_64″
os=”Windows” arch=”amd64″
Linuxos=”Linux” arch=”x86″
os=”Linux” arch=”i386″
os=”Linux” arch=”x86_64″
os=”Linux” arch=”amd64″
Macosos=”Mac” arch=”i386″
os=”Mac” arch=”x86″
os=”Mac” arch=”ppc”
Leave a Comment :, , more...