2010-03-27 4 views
2

Je ne sais pas si une solution existe mais ce serait très souhaitable.Comment créer une applet Scala dont la classe Applet est un singleton?

Je fais une Scala Applet, et je veux la principale classe Applet d'être un singleton il est accessible ailleurs dans l'applet, un peu comme:

object App extends Applet { 
    def init { 
    // do init here 
    } 
}

Au lieu de cela je dois faire la App classe une classe instanciable normale sinon elle se plaint parce que le constructeur est privé. Donc, le hack laid j'est d'aller:

object A { 
    var pp: App = null 
} 

class App extends Applet { 
    A.pp = this 
    def init { 
    // do init here 
    } 
}

Je déteste vraiment ça, et est l'une des raisons pour lesquelles je n'aime pas faire applets à Scala en ce moment.

Une meilleure solution? Ce serait bien ...

edit - J'ai trouvé une solution de piratage assez décente utilisant la conversion implicite. Déclarez votre classe Applet comme une classe normale, puis ajoutez:

class Appable {} 

object App extends Appable { 
implicit def appable2App(a:Appable) = inst 
    var inst: App = null 
} 

Ensuite vient de mettre la variable d'instance lorsque l'Applet est créé et vous pouvez accéder à tout comme si elle était un singleton.

+0

Est-ce le 'scala.swing.Applet' ou le' java.applet.Applet'? D'une manière ou d'une autre, vous devriez inclure suffisamment de code dans votre "vilain bidouille" pour qu'il soit compilé. Dans mes mains, aucun exemple ne se soucie des constructeurs privés, mais tous deux se plaignent que «ui» doit être défini. –

+0

Il provient d'une classe héritée de java.applet.Applet. Je vais peut-être passer un peu de temps à faire un exemple de base. Notez bien que ceci est seulement un problème avec un navigateur web, comme une applet de fichier jar peut lancer à partir d'un principal statique() – nullspace

Répondre

3

Ce que vous demandez est contraire au modèle d'exécution de l'applet. En particulier, il n'existe aucune garantie que plusieurs copies de l'applet ne seront pas exécutées dans la même JVM. La valeur par défaut est d'exécuter chaque applet dans la même machine virtuelle Java (y compris plusieurs copies du même applet si nécessaire). Voir par exemple Sun's tutorial.

C'est pourquoi les applets sont spécifiées comme elles le sont à la place d'une méthode static public void. Le reste de votre code ne peut-il pas prendre l'applet comme paramètre?

+1

Wow, cela explique le comportement fou que j'ai eu. Cela signifie que vous ne pouvez pas utiliser des singletons qui ont des effets secondaires lors de l'utilisation d'une applet. Je pense que cela signifie aussi que je n'utiliserai probablement plus Scala pour une applet. Merci pour la réponse. – nullspace

+0

Dans ce cas, n'utilisez pas non plus Java ou tout autre langage JVM. C'est le même modèle, tu sais! –

+0

Oui, ça m'est venu après, lol. Je suppose que les objets statiques ne sont pas conçus pour fonctionner avec l'environnement du navigateur. C'est bien, je peux juste courir d'un pot quand j'ai besoin de deux instances sur un ordinateur. – nullspace