статический класс в Java - PullRequest
       1

статический класс в Java

2 голосов
/ 09 сентября 2010

Как мне объявить статический класс в Java?eclipse хочет, чтобы я удалил «static» из объявления.

static public class Constants {

Ответы [ 6 ]

7 голосов
/ 09 сентября 2010

Сначала ответьте на ваш вопрос:

Только вложенный класс может быть объявлен статическим. Класс верхнего уровня не может объявлен быть статичным.

Во-вторых, Внутренний класс - это вложенный класс, который явно не объявлен как статический. См. спецификацию языка Java . Таким образом, вопреки некоторым ответам здесь, Внутренние классы не могут быть статичными

Чтобы привести пример из спецификации:

class HasStatic{
    static int j = 100;
}
class Outer{
    class Inner extends HasStatic{
        static final int x = 3; // ok - compile-time constant
        static int y = 4; // compile-time error, an inner class
    }
    static class NestedButNotInner{
        static int z = 5; // ok, not an inner class
    }
    interface NeverInner{}  // interfaces are never inner
}
1 голос
/ 09 сентября 2010

Если под «статическим» вы подразумеваете «может иметь только статические члены», в Java такого нет.

Внутренние классы (и только они) могут быть статическими, но это другая концепция. Внутренние статические классы могут все еще иметь члены экземпляра.

0 голосов
/ 03 мая 2017

В Java нет прямого эквивалента статических классов C #, но, на мой взгляд, самым близким является пустой список, который может показаться странным на первый взгляд, но имеет смысл, когда вы больше об этом думаете.Перечисление в Java (в отличие от C #), по сути, представляет собой набор одноэлементных экземпляров, которые все реализуют один и тот же абстрактный базовый класс и интерфейсы.Самый быстрый и безопасный способ создать нормальный синглтон в Java - это примерно так:

enum Foo {
    INSTANCE;
    public Bar doSomething(Baz baz) {
        return Bar.fromBaz(baz); // yadda yadda
    }
}

Так что, поскольку мы имеем дело с наборами синглетонов, имеет смысл иметь пустой набор.А пустой набор означает, что экземпляров быть не может.Концептуально это то же самое, что статический класс в C #.

 enum MyUtilities {
    ;
    static Bar doSomething(Baz baz) {
         return Bar.fromBaz(baz); // yadda yadda
    }
    static final String SOME_CONSTANT = "QUX";
 }

Это замечательно, потому что вы не потеряете покрытие тестами из-за трудностей в тестировании частных конструкторов в конечном классе, и код будет чище, чемконечный класс с пустым закрытым конструктором.

Теперь, если статические классы предназначены для всех, работающих на одном интерфейсе, и у вас есть контроль над этим интерфейсом, то вы должны реализовать статические методы на этом интерфейсе (то, что вы не можете сделать в C #).

0 голосов
/ 21 февраля 2013

Как вы уже сказали из других комментариев, классы не могут быть объявлены статическими. Однако есть альтернативы этой проблеме.

Самый простой способ - предварять все переменные-члены и методы статическим модификатором. По сути, это то, что вы хотите.

Несколько более сложная альтернатива - сделать класс одиночным. Это класс, в котором с помощью закрытого конструктора и метода instanceOf () или просто Enum можно получить только один экземпляр этого класса. Семантически и синтаксически вы рассматриваете этот экземпляр как обычный экземпляр любого конкретного класса, который вы создаете синглтоном, но у вас может быть только один экземпляр этого класса, который вы получаете через SomeObject.instanceOf () или в реализации Enum, SomeObject .INSTANCE.

Обычно вы используете Enums для реализации этого, за исключением крайних случаев, когда вы расширяете другой класс.

Для получения более полной информации о синглетах перейдите по ссылке ниже.

Разработка шаблонов на Java - Singleton

0 голосов
/ 09 сентября 2010

Eclipse жалуется правильно, ваш код не будет компилироваться как Класс верхнего уровня не может быть объявлен как статический.

Вы должны сначала понять, что означает статический класс.

статический класс :

Класс верхнего уровня не может быть объявлен как статический. Только классы Member и Nested могут быть определены как статические.

Вы объявляете классы-члены, когда хотите использовать переменные и методы содержащего класса без явного делегирования. Когда вы объявляете класс-член, вы можете создать экземпляр этого класса-члена только в контексте объекта внешнего класса, в котором этот класс-член объявлен. Если вы хотите снять это ограничение, вы объявляете класс-член статическим классом. Когда вы объявляете класс-член со статическим модификатором, он становится вложенным классом верхнего уровня и может использоваться как обычный класс верхнего уровня, как описано выше. .

вложенный класс верхнего уровня является классом-членом со статическим модификатором. Вложенный класс верхнего уровня аналогичен любому другому классу верхнего уровня, за исключением того, что он объявлен в другом классе или интерфейсе. Вложенные классы верхнего уровня обычно используются как удобный способ группировки связанных классов без создания нового пакета.

Также проверьте , когда мы должны использовать статический класс, переменные и методы в java

0 голосов
/ 09 сентября 2010

Все классы верхнего уровня неявно static, что означает, что они могут быть доступны всем. Так что имеет смысл только делать внутренние классы необязательно static.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...