Devi chiamare il metodo privato nella libreria di terze parti. Copia tutta la classe o usa la riflessione?

1

Devo chiamare un metodo disponibile in una libreria di terze parti, ma è un metodo privato. Non esiste un modo diretto o indiretto per ottenere la stessa funzionalità tramite i metodi pubblici disponibili.

Potrei farlo in almeno due modi:

  • Copia incolla la classe nella mia struttura del codice sorgente (la licenza lo consente) e cambia la dichiarazione del metodo in accessibile.
  • Utilizza Java reflection per chiamare il metodo privato.
  • Ok, posso anche aprire la richiesta pull per modificare la visibilità sul lato della community di librerie di terze parti ( l'ho fatto ), ma possono accettare, non possono, non chiaro quanto tempo ci vorrebbe, e ho bisogno della funzionalità fornita da questo metodo.

Entrambi gli approcci non sembrano molto belli. Quale è meno brutto?

    
posta h22 07.02.2018 - 09:32
fonte

1 risposta

8

Se la funzionalità non fa parte dell'API della libreria, non dovresti usarla. Non c'è alcuna garanzia che sarà ancora disponibile nelle versioni future e che non cambierà. Quindi utilizzare la riflessione per accedere agli interni è una strategia di ultima istanza.

È spesso ragionevole dare un fork alla libreria e aggiungere questa funzionalità da soli. È quindi possibile offrire una richiesta pull al progetto upstream, in modo che le modifiche possano far parte di una futura release mainstream. Questa strategia è preferibile perché il tuo cambiamento sarà supportato dal progetto upstream. Ma questo funziona solo se il tuo cambiamento si inserisce nella visione del progetto, ad es. nessuna drastica espansione dell'ambito. Cambiare semplicemente un metodo da privato a pubblico non è probabilmente un cambiamento accettabile. Questo è un hack . Invece, valuta come la biblioteca dovrebbe essere progettata per affrontare il tuo caso d'uso.

Se il progetto upstream non accetta il tuo suggerimento, puoi comunque mantenere la tua forcella. Tuttavia, questo rende difficile tenersi aggiornati con gli aggiornamenti. Questo è particolarmente problematico per gli aggiornamenti di sicurezza. Nel corso del tempo, la fusione a monte delle tue modifiche diventerà sempre più difficile man mano che divergono. Si prega di considerare se è possibile impegnarsi per il mantenimento di questa forcella, e quindi portare questo rischio.

Per le modifiche che sono utili solo a te, fornisci tale funzionalità come una classe o una libreria completamente separate. Se la libreria originale è concessa in licenza in modo appropriato, è possibile riutilizzare parti rilevanti del codice sorgente. Copiare semplicemente un'intera lezione e modificare alcuni dettagli non è probabilmente di aiuto. Invece, guarda questo codice sorgente come punto di partenza per il tuo progetto.

    
risposta data 07.02.2018 - 10:30
fonte

Leggi altre domande sui tag