2010-05-12 3 views
0

У меня есть класс Java, в котором каждый метод был определен как static. Так что мне не нужно переписывать класс, а затем хороший бит кода, который зависит от него, я добавляю некоторые сообщения об ошибках через переменную экземпляра. Однако Java, похоже, не может получить доступ к переменным экземпляра из методов класса. Я читаю переменные класса Sun description и опасаюсь просто изменить каждый метод на метод экземпляра в этом классе без лучшего понимания того, как он будет работать в веб-приложении.Использование памяти переменных класса Java и экземпляра в веб-приложении?

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

Если бы я должен был создать переменную класса для отслеживания ошибок, разве это не привело бы к ситуации, когда процесс А мог вызвать ошибку в процессе B? Могут ли методы экземпляра даже получить доступ к переменным класса?

Edit:

Позвольте мне пояснить, что я пытаюсь выполнить с некоторыми примерами кода.

Во-первых, мой класс:

public class MyClass { 
    public int error = 0;

public String methodA() { // Do some stuff if (ret == null) this.error = 1; return ret; }

public static boolean methodB() { // Same thing but I can't access this.error here } }

Теперь мое приложение:

MyClass myClass = new MyClass(); 
String aString = myClass.methodA(); 
if (myClass.error != 0) { 
    out.print("What did you do!?"); 
    return; 
} 

ответ

2

методы класса одни и те же ячейки памяти для всех экземпляров объекта

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

Если бы я создать класс переменной для отслеживания ошибок, не будет ли это ввести ситуацию, когда процесс А может вызвать ошибку в процессе B? Может ли метод экземпляра даже получить доступ к классам переменных?

Да и да. Вот почему использование нестационарных статических полей обычно считается плохим.

+0

«Вот почему, имеющих статические поля, как правило, считается плохим вещь." ... за исключением «констант» (окончательный примитив/неразрешимый), которые читаются только. – leonbloy

+0

Итак, если я должен был повторно объявить все методы как методы экземпляра (удалить статическое ключевое слово), то я бы не взял на себя штраф за память? То есть, каждый новый запрос страницы не требует больше памяти, чем если бы методы были статическими? –

+0

@jsumners: вам потребуется создать хотя бы один экземпляр, который занимает около 8 байтов плюс любые поля экземпляров, которые вы определяете, - не стоит беспокоиться, другими словами. –

0

Держите статический частный случай

class Foo { 
    private static Foo myInstance = new Foo(); 

    public static void MyPretendInstanceMethod() { 
     myInstance.doBar(); 
    } 

    private void doBar() { 
     // do stuff here 
    } 

} 

Добавить синхронизацию по мере необходимости.

0

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

Вам не нужно создавать новый экземпляр класса для доступа к статическому члену или переменной (при условии, что он общедоступен). В вашем примере вы можете вызвать методB следующим образом:

String bString = MyClass.methodB(); 

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

Но поскольку Methoda не статична, вы должны создать экземпляр класса для того, чтобы назвать это, как вы делали в вашем примере:

MyClass myClass = new MyClass(); 
String aString = myClass.methodA(); 
Смежные вопросы