2015-05-17 2 views
-1

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

Итак, почему я делаю методы статическими? Поскольку 1) проект настолько велик, что мне нужно, например, MyClass.AccessThis() и 2) проще, чем создать экземпляр и вызвать метод.

EDIT: Что я имею в виду с 2), если я превращу все свои методы в нестатический, открытый конструктор, то я могу создать экземпляр класса в любом классе и использовать мои методы.

EDIT 2: Итак, вот оно.

public final class StackOverFlow { 

private static Map<String, String> map = new HashMap<String, String>(); 

    private StackOverFlow() { 

     map.put("hello", "hello"); 
    } 

    public static String getHello() { 
     return map.get("hello"); 
    } 
} 

Я не могу, очевидно, получить данные, если я вызвать метод из другого класса по StackOverFlow.getHello(); потому что данные не существуют.

Мне интересно, есть ли хороший способ получить данные, не помещая данные в статический метод?

+2

Пожалуйста, внесите свой код. – Timo

+1

* Поскольку у меня есть данные в конструкторе, которые нужны статическим методам * - как вы собираетесь получать данные этого экземпляра с помощью метода * static *? Ваш вопрос не очень ясен, потому что он, по-видимому, основан на невозможной предпосылке. –

+3

Я уверен, что вы делаете объектно-ориентированное программирование неправильно ...: D –

ответ

1

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

Нет. Это неправильное изображение. Это не так, как работают статические методы.

Для каждого класса вы пишете, есть два возможных структур данных: объект

  • класса. Каждый класс имеет ассоциированный объект класса.
  • Экземпляры. Классы могут также иметь экземпляры (определенные классом)

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

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

Я не могу, очевидно, получить данные, если я вызвать метод из другого класса по StackOverFlow.getHello();

Мне интересно, есть ли хороший способ получить данные, не помещая данные в статическом методе?

О да, можете. Данные принадлежат объекту Class, StackOverflow. Любой объект, который может получить доступ к вашему классу StackOverflow и имеет доступ к его методам, может получать ваши данные независимо от того, где они находятся в вашем проекте. Статические поля являются своего рода глобальными данными. В вашем случае любой метод, который находится в том же файле .class, что и StackOverflow, может попасть в ваш объект карты.

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

0

Если вы создаете статический метод, вы можете вызвать его без его инициализации. , например:

class MyClass { 
    public static int myMethod() { ... } 
} 

Вызов должен быть:

int result = MyClass.myMethod(); 
0

Это может быть то, что вы ищете, статической инициализации:

public final class StackOverFlow { 

    // remove the final if you have methods modifying the map 
    private static final Map<String, String> map = new HashMap<String, String>(); 
    static { 
     map.put("hello", "hello"); 
    } 

    public static String getHello() { 
     return map.get("hello"); 
    } 

} 

Мне нравится, что вы никогда не должны создавать объект для доступа getHello().

Смежные вопросы