8
votes

Déplacement d'un forfait-Classe privée - Dois-je envisager cette incompatible binaire?

En raison d'un problème avec nom de package aux code> sous Windows, je déplace une classe d'assistance dans la hiérarchie de l'emballage de ma bibliothèque de xxx pré>

à p >

Found 2 binary incompatibiities
===============================
 * class de.sciss.scalainterpreter.aux.Helper does not have a correspondent
   in new version
 * object de.sciss.scalainterpreter.aux.Helper does not have a correspondent
   in new version


0 commentaires

3 Réponses :


0
votes

Mettez simplement, aucune raison pour laquelle ce ne serait pas. Le lien arrive autour des signatures; Étant donné que l'objet en question est défini sur l'unité de compilation, les clients ne peuvent (ou plutôt pas) l'utiliser et la compatibilité binaire n'est donc pas un problème.


0 commentaires

3
votes

Vous ne spécifiez pas si assistant code> était déjà package privé avant le déménagement. Je vais donc traiter les deux cas:

  • Si c'était déjà package privé: p>

    Je soupçonne que le gestionnaire de migration signale une incompatibilité uniquement car elle doit rester conservatrice: les packages sont ouverts à Scala (comme en Java), ce qui signifie que le code client pourrait très bien définir un package de classe scinainainerpter code> . Donc, en déplaçant assistant code>, vous allez effectivement casser cette classe. P>

    Cependant, soyons pragmatiques: de.siss.scalainterprètre.aux code> est votre paquet em> (et devrait donc être leurs sous-packages), et personne ne devrait définir leurs propres cours là. Avec cette condition préalable supplémentaire, le déplacement assistant code> est en effet un changement compatible binaire vers le code SCALA STRAND>. p>

    comme pour le client Java STRT>, c'est un peu différent car même si assistant code> est package privé, sa visibilité est toujours public code> en ce qui concerne La JVM est concernée, et donc le compilateur Java permettra de laisser accéder au code client assistant code> (ainsi que le code Java client pourrait très bien déjà accéder à assistant code>, malgré l'être déclaré package privé) . P> li>

  • S'il n'était pas package privé avant le déménagement: p>

    Bien, chance. Le code client pourrait très bien déjà accéder à assistant code>, et le déménagement va certainement casser cela. En tant que note latérale, vous pouvez utiliser un petit tour pour faire le changement de source compatible avec la source, mais Hélas pas strong> compatible binaire. Il suffit d'ajouter le fichier suivant: p>

    package de.sciss
    
    package object scalainterpreter {
      object aux {
        val Helper = _root_.de.sciss.scalainterpreter.Helper
      }
    }
    


3 commentaires

Merci. Désolé si cela n'était pas clair-oui, assistant est emballé privé avant, rien n'a changé concernant sa visibilité.


Ensuite, vous êtes sur le côté sûr, à condition que vous n'aviez aucune annotation inline, comme indiqué par User1296806. L'annotation inline est généralement injustifiée de toute façon, car la gigue peut la plupart du temps en ligne vos points chauds (en particulier sur un serveur VM).


@ user1296806 Compte tenu de la taille pure de la bibliothèque, quelques centaines de survenus des annotations inline (j'ai trouvé moins de 100 dans la bibliothèque elle-même) est très faible. J'aurais attendu plus. Ce n'est pas comme l'inlinage est jamais utile.



1
votes

Il est facile de voir comment l'inlinge peut casser le code client, car le code inlinébe saigne essentiellement dans l'interface client. Cet exemple demande vraiment une erreur de liaison; Nous pouvons expérimenter et faire des choses comme Javap | HELPER GREP, mais à un certain niveau, vous devez laisser Scalac faire son travail.

$ scala -cp "classes;target" client.Test
Does this help?

apm@halyard ~/tmp/taking-it-private
$ vi lib.scala

apm@halyard ~/tmp/taking-it-private
$ rm -rf classes/*

apm@halyard ~/tmp/taking-it-private
$ smalac -d classes -optimise lib.scala 

apm@halyard ~/tmp/taking-it-private
$ smala -cp "classes;target" client.Test
java.lang.ClassNotFoundException: lib.util.Helper$


2 commentaires

Bon point, je n'avais pas pensé à l'inliction; semble assez complexe. Heureusement, dans mon cas, il n'y a pas d'annotations inline et je n'ai pas compilé avec -Optimize .


Cette réponse est une réponse à "Je soupçonne que si le code du client n'appelle pas d'objet, ...", à savoir, vous ne pouvez pas raisonner de la source de la source à un compat binaire. Ceci est un exemple où les machines sont visibles et un exemple suffit. Vous pouvez trouver d'autres personnes, avec votre autre question sur Final Val Consts ou implicites. Sinon, votre question est tautologique: soit oui bien sûr vous allez bien, soit bien sûr que non.