Как объявить операторы, использующие this, как статические? - PullRequest
0 голосов
/ 05 января 2012

У меня есть действие с именем Gridactivity,

public String readFile(int file)
    {
        try{
        InputStream is = this.getResources().openRawResource(file);
        byte[] buffer = new byte[is.available()];
        System.out.print(is.available());
        System.out.print(is.available());

        while (is.read(buffer) != -1)   
            ;
        String text = new String(buffer);
    return(text);
        } catch (Exception e) {
            String Ex=" ";
            return(Ex);
        }
    }

, за которым следует метод чтения файлов - readFile (), который читает файл из необработанной папки, сохраняет его в строке и возвращает его.Вот теперь мне нужно сделать этот readFile как статический.Но здесь выражение «this» в InputStream is = this.getResources().openRawResource(file); не является статичным.Как сделать это статической функцией, чтобы я мог получить к ней доступ из других классов и занятий?

Ответы [ 7 ]

2 голосов
/ 05 января 2012

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

Одним из способов достижения статического метода является передача Resources в качестве аргумента следующим образом:

public static String readFile(Resources resources, int file) { ... }

И, в конце концов,

InputStream is = resources.openRawResource(file);
2 голосов
/ 05 января 2012

Вы не можете.

Метод экземпляра выполняется в контексте экземпляра его класса (например, экземпляра Gridactivity).this - это ключевое слово, которое относится к этому контексту.Статический метод не имеет такого контекста, так что бы означало this?

Ваши два варианта - сделать статический метод нестатичным или сделать любые методы, которые вы вызываете из статического метода, также статическимиЭто означает, что любая информация, необходимая вам от вашего this экземпляра, должна быть явно передана в качестве аргументов.Итак, вместо:

void myInstanceMethod() {
    System.out.println(this.myInt);
}

Вы должны сделать что-то вроде:

void myStaticMethod(int i) {
    System.out.println(i);
}
1 голос
/ 05 января 2012

В вашем случае попробуйте

public static String readFile(Context context, int file)

и используйте его здесь:

InputStream is = context.getResources().openRawResource(file);

По сути, вы передаете переменную в качестве параметра.

(getResources() - это метод для Context class).

1 голос
/ 05 января 2012

Простой обходной путь - передача контекста.

public static String readFile(Context context, int file) {
    try{
        InputStream is = context.getResources().openRawResource(file);
[...]

А вот вызов моего кода:

String content=GridActivity.readFile(this, 123);
0 голосов
/ 05 января 2012

Вы не можете сделать это напрямую, НО: Вы можете объявлять статические переменные и загружать в них значения в функции onCreate. ТАМ можно использовать это .

Или сделать некоторую функцию инициализации

initAllStaticStuff(Context context){
    someStaticVariable=context.getResources...
} 

вызывается из onCreate как

initAllStaticStuff(this).

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

0 голосов
/ 05 января 2012

статические члены и методы доступны в основном с именем класса, а также с именем объекта.

ключевое слово this означает текущий объект.

Если вы не знаетео статических, пожалуйста, прочитайте информацию на этом lnik

0 голосов
/ 05 января 2012

Кажется, вы не понимаете концепцию статических членов класса.

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

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