2013-02-07 10 views
5

Mi è stato detto da qualcuno che non dovremmo chiamare un metodo pubblico di una classe da un altro metodo pubblico nella stessa classe. Ora non sono in grado di capire questo perché non vedo alcun problema con quello. Una volta che un metodo è stato dichiarato pubblico, il suo contratto è fisso per tutta la vita e quindi non ci dovrebbero essere problemi nel chiamarlo da un altro metodo pubblico.Perché non dovremmo chiamare il metodo pubblico da un altro pubblico?

Quindi non sono sicuro che tale affermazione sia vera o che sia ok per chiamare publicapi da un'altra API pubblica [Questo è dal punto di vista del design]?

+2

Non so perché la vostra la domanda è stata rifiutata, ma ciò che quella persona ti ha detto ** non ha senso **. – Augusto

+0

** Quindi non sono sicuro che quella affermazione sia vera o che sia ok ** fai un piccolo test te stesso, immagino che otterrai la tua risposta da solo se tu. – subodh

risposta

11

Il compilatore non ti risponde quando provi? No? Quindi è legale in questo senso.

La persona che fornisce questo "consiglio" produce un documento canonico che spiega lo standard (nel settore o all'interno della propria organizzazione)? No? Quindi è opinione.

Consulta i tuoi standard aziendali, ma in caso contrario, chiamo assurdità.

2

Non sono sicuro di cosa intendesse. Ovviamente puoi chiamare un metodo pubblico da un altro metodo pubblico. Non è una cattiva idea - anche la fonte di Java ha metodi in cui un metodo pubblico chiama un altro metodo pubblico.

Perché non chiedi al tizio che ti ha consigliato di spiegarne il motivo? Penso che sia in una posizione migliore per dirlo di noi.

4

Quando chiamate molto spesso metodi pubblici da altri metodi pubblici della stessa classe, probabilmente significa che avete metodi di utilità non necessari. E forse dovresti cercare di essere un po 'più ASCIUTTO in modo da facilitare la manutenzione e mantenere la tua API facile da cogliere.

Ma questo è solo un avvertimento, è perfettamente valido chiamare un metodo pubblico da un altro, e troverete molti esempi del codice standard java.lang che fa proprio questo.

Un esempio dal java.lang.String:

1462 public boolean startsWith(String prefix) { 
1463  return startsWith(prefix, 0); 
1464 } 

Non ci sarebbe nessun punto nel fare alcuni metodi privato solo per far rispettare una regola sui metodi pubblici non chiamare altri metodi pubblici.

0

Ovviamente è possibile chiamare qualsiasi metodo pubblico da un altro metodo pubblico, indipendentemente dalla stessa classe o da un'altra classe. Ma lo standard è importante per un'organizzazione diversa. Dagli qualche esempio valido.

6

Se si richiamano metodi pubblici da altri metodi pubblici, la verifica dell'unità risulta più complicata. Se un metodo è dipendente da un altro metodo della stessa classe, non è possibile prenderlo in giro per testarlo separatamente. Quindi potresti dover scrivere due volte il codice di prova per lo stesso metodo.

vedi anche Unit testing a method that calls another method

0

A mio parere si dovrebbe evitare di chiamare un metodo pubblico all'interno di un altro metodo a causa di eredità. Considerate le classi:

public class Parent { 

    //return sum 
    public double getSum(double... value){ 
     //implementation 
    } 

    //return average 
    public double getAverage(int count){ 
     //call getSum 
     double sum = getSum(20, 40, 60); 
     return sum/count; 

    } 
} 

public class Child extends Parent { 

    @Override 
    public int getSum(double... obj){ 
     // change implementation 
     // always return 100; 
    } 
} 

Se avete chiamato il metodo oggetto Bambino getAverage, si potrebbe ottenere un certo valore inaspettato, intera interfaccia di oggetto secondario è rotto. Devi anche sovrascrivere il metodo getAverage ...

Esempio con classe String

1462 public boolean startsWith(String prefix) { 
1463  return startsWith(prefix, 0); 
1464 } 

è da questo punto di vista sbagliato, perché stringa è definitiva, quindi non si può ereditare e sovrascrivere i suoi metodi pubblici ..

Problemi correlati