El código no se compila:
Test.java:8: method() in Bar cannot override method() in Foo; overridden method is static final public static void method() {
El mensaje es engañoso ya que un método estático puede, por definición, no puede anular.
hago lo siguiente al codificar (no el 100% todo el tiempo, pero nada aquí es "malo":
(El primer conjunto de "reglas" se llevan a cabo para la mayoría de las cosas - algunos casos especiales se cubren después)
- crear una interfaz
- crear una clase abstracta que implementa la interfaz
- crear clases concretas que amplían la clase abstracta
- crear concret clases de correos que implementa la interfaz, pero no extiende la clase abstracta
- siempre, si es posible, hacer que todas las variables/constantes/parámetros de la interfaz
Desde una interfaz no puede tener métodos estáticos que no terminan con el problema Si va a hacer métodos estáticos en la clase abstracta o en clases concretas, deben ser privados, entonces no hay forma de intentar anularlos.
casos especiales:
clases de utilidad (clases con todos los métodos estáticos):
- declarar la clase como definitiva
- le dan un constructor privado para evitar la creación accidental
Si desea tener un método estático en una clase concreta o abstracta que no sea privada, probablemente desee crear una clase de utilidad en su lugar.
clases de valores (una clase que es muy especializado para mantener esencialmente datos, como java.awt.Point donde se mantiene bastante mucho valores X e Y):
- hay necesidad de crear una interfaz
- no es necesario crear una clase abstracta
- clase debe ser final
- métodos estáticos no privados son correctos, especialmente para la construcción, ya que es posible que desee realizar el almacenamiento en caché.
Si sigue los consejos anteriores, terminará con un código bastante flexible que también tiene una separación bastante clara de responsabilidades.
Un ejemplo de clase de valor es esta clase Lugar:
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);
}
}
¿dónde lo obtuviste? ¿mala práctica? –
Reformó la pregunta;) La inspección por defecto de IntelliJ lo sugiere y no recibí una respuesta definitiva de las búsquedas de Google. – brasskazoo
La inspección de NetBeans también sugiere que esta es una mala práctica. – steve