Использование памяти переменных класса Java и экземпляра в веб-приложении? - PullRequest
0 голосов
/ 12 мая 2010

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

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

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

Edit:

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

Во-первых, мой класс: public class MyClass { public int error = 0;</p> <p>public String methodA() { // Do some stuff if (ret == null) this.error = 1; return ret; }</p> <p>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; }

Ответы [ 3 ]

2 голосов
/ 12 мая 2010

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

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

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

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

0 голосов
/ 12 мая 2010

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

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

String bString = MyClass.methodB();

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

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

MyClass myClass = new MyClass();
String aString = myClass.methodA();
0 голосов
/ 12 мая 2010

Хранить статический частный экземпляр

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

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

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

}

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

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