Il codice non può essere compilato:
Test.java:8: method() in Bar cannot override method() in Foo; overridden method is static final public static void method() {
Il messaggio è fuorviante in quanto un metodo statico può, per definizione, non essere sovrascritto.
faccio la seguente quando si scrive codice (non al 100% per tutto il tempo, ma niente qui è "sbagliato":
(La prima serie di "regole" sono fatto per la maggior parte delle cose - alcuni casi particolari sono coperti dopo)
- creare un'interfaccia
- creare una classe astratta che implementa l'interfaccia
- creare classi concrete che estendono la classe astratta
- creare concret e le classi che implementa l'interfaccia, ma non estendere la classe astratta
- sempre, se possibile, fare tutte le variabili/costanti/parametri dell'interfaccia
Dal momento che un interfaccia non può avere metodi statici non Wind Up con il problema. Se stai andando a fare metodi statici nella classe astratta o in classi concrete, questi devono essere privati, quindi non c'è modo di provare a sovrascriverli.
Casi particolari:
classi di utilità (classi con tutti i metodi statici):
- dichiarare la classe come definitiva
- dargli un costruttore privato per impedire la creazione accidentale
Se si desidera avere un metodo statico in una classe concreta o astratta che non è privato, si preferisce invece creare una classe di utilità.
classi di valore (una classe che è molto specializzato per tenere in sostanza i dati, come java.awt.Point dove è praticamente in mano valori xey):
- non c'è bisogno di creare un'interfaccia
- non è necessario creare una classe astratta
- classe dovrebbe essere finale
- metodi statici non privati sono OK, soprattutto per la costruzione come si potrebbe desiderare di eseguire la memorizzazione nella cache.
Se si segue il consiglio di cui sopra si finirà con un codice piuttosto flessibile che ha anche una separazione delle responsabilità abbastanza pulita.
Una classe di valore di esempio è questa classe Località:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class Location
implements Comparable<Location>
{
// should really use weak references here to help out with garbage collection
private static final Map<Integer, Map<Integer, Location>> locations;
private final int row;
private final int col;
static
{
locations = new HashMap<Integer, Map<Integer, Location>>();
}
private Location(final int r,
final int c)
{
if(r < 0)
{
throw new IllegalArgumentException("r must be >= 0, was: " + r);
}
if(c < 0)
{
throw new IllegalArgumentException("c must be >= 0, was: " + c);
}
row = r;
col = c;
}
public int getRow()
{
return (row);
}
public int getCol()
{
return (col);
}
// this ensures that only one location is created for each row/col pair... could not
// do that if the constructor was not private.
public static Location fromRowCol(final int row,
final int col)
{
Location location;
Map<Integer, Location> forRow;
if(row < 0)
{
throw new IllegalArgumentException("row must be >= 0, was: " + row);
}
if(col < 0)
{
throw new IllegalArgumentException("col must be >= 0, was: " + col);
}
forRow = locations.get(row);
if(forRow == null)
{
forRow = new HashMap<Integer, Location>(col);
locations.put(row, forRow);
}
location = forRow.get(col);
if(location == null)
{
location = new Location(row, col);
forRow.put(col, location);
}
return (location);
}
private static void ensureCapacity(final List<?> list,
final int size)
{
while(list.size() <= size)
{
list.add(null);
}
}
@Override
public int hashCode()
{
// should think up a better way to do this...
return (row * col);
}
@Override
public boolean equals(final Object obj)
{
final Location other;
if(obj == null)
{
return false;
}
if(getClass() != obj.getClass())
{
return false;
}
other = (Location)obj;
if(row != other.row)
{
return false;
}
if(col != other.col)
{
return false;
}
return true;
}
@Override
public String toString()
{
return ("[" + row + ", " + col + "]");
}
public int compareTo(final Location other)
{
final int val;
if(row == other.row)
{
val = col - other.col;
}
else
{
val = row - other.row;
}
return (val);
}
}
dove hai trovato? cattive pratiche? –
Riformatta la domanda;) L'ispezione IntelliJ di default suggerisce che lo è, e non avevo ottenuto una risposta definitiva dalle ricerche di google. – brasskazoo
L'ispezione di NetBeans suggerisce anche che questa è una cattiva pratica. – steve