sirve - ¿Por qué no puedes declarar una clase como estática en Java?
public static java (14)
Además de cómo Java define las clases internas estáticas, existe otra definición de clases estáticas según el mundo C # [1] . Una clase estática es aquella que tiene solo métodos estáticos (funciones) y está destinada a soportar la programación de procedimientos. Tales clases no son realmente clases en las que el usuario de la clase solo está interesado en las funciones de ayuda y no en crear instancias de la clase. Si bien las clases estáticas son compatibles con C #, no existe tal soporte directo en Java. Sin embargo, puede usar enumeraciones para imitar las clases estáticas de C # en Java para que un usuario nunca pueda crear instancias de una clase determinada (incluso utilizando la reflexión) [2] :
public enum StaticClass2 {
// Empty enum trick to avoid instance creation
; // this semi-colon is important
public static boolean isEmpty(final String s) {
return s == null || s.isEmpty();
}
}
¿Por qué no puedes declarar una clase como estática en Java?
Claro que sí, pero solo clases internas anidadas. Allí, significa que las instancias de la clase anidada no requieren una instancia adjunta de la clase externa.
Pero para las clases de nivel superior, los diseñadores de idiomas no pudieron pensar en nada útil que hacer con la palabra clave, por lo que no está permitido.
Como se explicó anteriormente, una Clase no puede ser estática a menos que sea miembro de otra Clase.
Si está buscando diseñar una clase "de la cual no puede haber múltiples instancias", es posible que desee ver el patrón de diseño "Singleton".
Información de Singleton para principiantes here .
Advertencia:
Si está pensando en utilizar el patrón de singleton, resista con todas sus fuerzas. Es uno de los DesignPatterns más fáciles de entender, probablemente el más popular, y definitivamente el más abusado. (fuente: JavaRanch como enlazado arriba)
Creo que esto es posible tan fácil como beber un vaso de café !. Solo mira esto. No utilizamos palabras clave estáticas explícitamente al definir la clase.
public class StaticClass {
static private int me = 3;
public static void printHelloWorld() {
System.out.println("Hello World");
}
public static void main(String[] args) {
StaticClass.printHelloWorld();
System.out.println(StaticClass.me);
}
}
¿No es esa una definición de clase estática? Simplemente usamos una función vinculada a una clase. Tenga cuidado de que en este caso podamos usar otra clase en ese anidado. Mira esto:
class StaticClass1 {
public static int yum = 4;
static void printHowAreYou() {
System.out.println("How are you?");
}
}
public class StaticClass {
static int me = 3;
public static void printHelloWorld() {
System.out.println("Hello World");
StaticClass1.printHowAreYou();
System.out.println(StaticClass1.yum);
}
public static void main(String[] args) {
StaticClass.printHelloWorld();
System.out.println(StaticClass.me);
}
}
Entonces, voy a llegar tarde a la fiesta, pero aquí están mis dos centavos, añadiendo filosóficamente a la respuesta de Colin Hebert.
En un nivel alto, su pregunta trata con la diferencia entre objetos y tipos. Si bien hay muchos automóviles (objetos), solo hay una clase de Automóvil (tipo). Declarar algo como estático significa que está operando en el espacio "tipo". Sólo hay uno. La palabra clave de clase de nivel superior ya define un tipo en el espacio "tipo". Como resultado, "Carro público de clase estática" es redundante.
La clase con constructor privado es estática.
Declara tu clase de esta manera:
public class eOAuth {
private eOAuth(){}
public final static int ECodeOauthInvalidGrant = 0x1;
public final static int ECodeOauthUnknown = 0x10;
public static GetSomeStuff(){}
}
y se puede utilizar sin inicialización:
if (value == eOAuth.ECodeOauthInvalidGrant)
eOAuth.GetSomeStuff();
...
Las únicas clases que pueden ser estáticas son las clases internas. El siguiente código funciona bien:
public class whatever {
static class innerclass {
}
}
El punto de las clases internas estáticas es que no tienen una referencia al objeto de clase externa.
Las clases de nivel superior son estáticas por defecto. Las clases internas son no estáticas por defecto. Puede cambiar el valor predeterminado para las clases internas marcándolas explícitamente como estáticas. Las clases de nivel superior, en virtud de ser de nivel superior, no pueden tener una semántica no estática porque no puede haber una clase padre a la que referirse. Por lo tanto, no hay forma de cambiar el valor predeterminado para las clases de nivel superior.
Puede crear una clase de utilidad (que no puede tener instancias creadas) declarando un tipo de enumeración sin instancias. es decir, estás declarando específicamente que no hay instancias.
public enum MyUtilities {;
public static void myMethod();
}
Sólo las clases anidadas pueden ser estáticas. Al hacerlo, puede usar la clase anidada sin tener una instancia de la clase externa.
class OuterClass{
public static class StaticNestedClass{
}
public class InnerClass{
}
public InnerClass getAnInnerClass(){
return new InnerClass();
}
//This method doesn''t work
public static InnerClass getAnInnerClassStatically(){
return new InnerClass();
}
}
class OtherClass{
//Use of a static nested class:
private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();
//Doesn''t work
private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
//Use of an inner class:
private OuterClass outerclass= new OuterClass();
private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}
Fuentes:
Sobre el mismo tema:
Si el beneficio de usar una clase estática no era crear una instancia de un objeto y usar un método, simplemente declare la clase como pública y este método como estático.
Todo lo que codificamos en java entra en una clase. Cada vez que ejecutamos una clase JVM crea una instancia de un objeto. JVM puede crear una serie de objetos, por definición Estático significa que tiene el mismo conjunto de copia para todos los objetos.
Por lo tanto, si Java hubiera permitido que la clase superior fuera estática siempre que ejecute un programa, creará un Objeto y continuará anulando la misma Ubicación de Memoria.
Si está reemplazando el objeto cada vez que lo ejecuta, ¿cuál es el punto de crearlo?
Así que esa es la razón por la que Java se deshizo de la estática para la clase de nivel superior.
Puede haber razones más concretas, pero esto tiene mucho sentido lógico para mí.
Uno puede mirar PlatformUI
en Eclipse para una clase con métodos estáticos y un constructor privado, siendo él mismo el final.
public final class <class name>
{
//static constants
//static memebers
}
public class Outer {
public static class Inner {}
}
... se puede declarar estático, siempre que sea una clase miembro.
Desde el JLS:
Las clases de miembros pueden ser estáticas, en cuyo caso no tienen acceso a las variables de instancia de la clase circundante; o pueden ser clases internas (§8.1.3).
y aquí:
La palabra clave estática puede modificar la declaración de un tipo de miembro C dentro del cuerpo de una clase no interna T. Su efecto es declarar que C no es una clase interna. Así como un método estático de T no tiene una instancia actual de T en su cuerpo, C tampoco tiene una instancia actual de T, ni tampoco tiene instancias que encierren léxicamente.
Una palabra clave estática no tendría ningún sentido para una clase de nivel superior, simplemente porque una clase de nivel superior no tiene un tipo adjunto.