Non vedo un motivo particolare per cui questo dovrebbe essere disapprovato. Ci possono sempre essere alternative per ottenere lo stesso comportamento, e dipenderà dalla reale architettura se queste alternative sono "migliori" di un metodo statico protetto o meno.Ma un esempio in cui un metodo statico protetto sarebbe ragionevole, almeno, potrebbe essere il seguente:
(a cura di dividere in pacchetti separati, per rendere l'uso di protected
chiaro)
package a;
import java.util.List;
public abstract class BaseClass
{
public Integer compute(List<Integer> list)
{
return computeDefaultA(list)+computeDefaultB(list);
}
protected static Integer computeDefaultA(List<Integer> list)
{
return 12;
}
protected static Integer computeDefaultB(List<Integer> list)
{
return 34;
}
}
Derivato da tale :
package a.b;
import java.util.List;
import a.BaseClass;
abstract class ExtendingClassA extends BaseClass
{
@Override
public Integer compute(List<Integer> list)
{
return computeDefaultA(list)+computeOwnB(list);
}
private static Integer computeOwnB(List<Integer> list)
{
return 56;
}
}
Un'altra classe derivata:
package a.b;
import java.util.List;
import a.BaseClass;
abstract class ExtendingClassB extends BaseClass
{
@Override
public Integer compute(List<Integer> list)
{
return computeOwnA(list)+computeDefaultB(list);
}
private static Integer computeOwnA(List<Integer> list)
{
return 78;
}
}
Il modificatore protected static
può certamente essere giustificato qui:
- I metodi possono essere
static
, perché non dipendono da variabili di istanza. Non sono pensati per essere usati direttamente come metodo polimorfico, ma piuttosto come metodi "di utilità" che offrono le implementazioni predefinite che fanno parte di un calcolo più complesso e servono come "elementi costitutivi" dell'attuazione reale.
- I metodi non devono essere
public
, perché sono un dettaglio di implementazione. E non possono essere private
perché dovrebbero essere chiamati dalle classi di estensione. Inoltre non possono avere visibilità "predefinita", perché quindi non saranno accessibili per le classi di estensione in altri pacchetti.
(EDIT: Si potrebbe supporre che il commento originale di cui solo per campi, e non a metodi - allora, tuttavia, era troppo generale)
Non c'è niente di sbagliato in un campo statico protetto, a patto che sia 'finale'. Un campo statico mutabile condiviso tra le classi è sicuramente motivo di preoccupazione. Non è probabile che più classi che aggiornano un campo statico siano affidabili o facili da seguire, soprattutto perché la presenza di qualsiasi campo o metodo protetto implica che la classe debba essere estesa da classi in altri pacchetti, possibilmente classi non sotto il controllo del autore della classe che contiene il campo protetto. – VGR
@ VGR, 'final' non significa che il campo è immutabile. Puoi sempre modificare l'oggetto referenziato da una variabile di riferimento 'finale'. – Zeeshan
@VGR Non sono d'accordo. L'UNICA ragione per cui si dovrebbe creare una variabile statica è di avere accesso ad essa da un altro pacchetto solo per ereditarietà, e l'accesso a un singolo campo NON dovrebbe essere la ragione dell'ereditarietà. È un design imperfetto, IMO, e se ricorrerai a ciò, dovresti probabilmente ripensare la struttura della tua applicazione. Questa però è solo la mia opinione. –