Функция из базы данных не может использоваться нигде в другом классе, java [duplicate]

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

При добавлении всех значений ( a + b ) с шагом 0,1 (от 0,1 до 100) имеем ~ 15% вероятность ошибки точности. Обратите внимание, что ошибка может привести к несколько большим или меньшим значениям. Вот несколько примеров:

0.1 + 0.2 = 0.30000000000000004 (BIGGER)
0.1 + 0.7 = 0.7999999999999999 (SMALLER)
...
1.7 + 1.9 = 3.5999999999999996 (SMALLER)
1.7 + 2.2 = 3.9000000000000004 (BIGGER)
...
3.2 + 3.6 = 6.800000000000001 (BIGGER)
3.2 + 4.4 = 7.6000000000000005 (BIGGER)

При вычитании всех значений ( a - b , где a> b ) с шагом 0,1 (от 100 до 0,1), мы имеем вероятность 34% точности. Вот несколько примеров:

0.6 - 0.2 = 0.39999999999999997 (SMALLER)
0.5 - 0.4 = 0.09999999999999998 (SMALLER)
...
2.1 - 0.2 = 1.9000000000000001 (BIGGER)
2.0 - 1.9 = 0.10000000000000009 (BIGGER)
...
100 - 99.9 = 0.09999999999999432 (SMALLER)
100 - 99.8 = 0.20000000000000284 (BIGGER)

* 15% и 34% действительно огромны, поэтому всегда используйте BigDecimal, когда точность имеет большое значение. С 2 десятичными цифрами (шаг 0,01) ситуация несколько ухудшается (18% и 36%).

87
задан BalusC 7 May 2016 в 07:10
поделиться

8 ответов

Поскольку getText() нестатический, вы не можете вызвать его из статического метода.

Чтобы понять, почему вы должны понимать разницу между ними.

Экземпляр ( нестатические) методы работают с объектами определенного типа (класса). Они создаются с помощью следующего типа:

SomeClass myObject = new SomeClass();

Чтобы вызвать метод экземпляра, вы вызываете его в экземпляре (myObject):

myObject.getText(...)

Однако статический метод / поле можно вызывать только по типу напрямую, например: Предыдущее утверждение неверно. Можно также ссылаться на статические поля с ссылкой на объект, например myObject.staticMethod(), но это обескураживает, поскольку не дает понять, что они являются переменными класса.

... = SomeClass.final

И они не могут работать вместе, поскольку они работают в разных пространствах данных (данные экземпляра и данные класса)

Позвольте мне попытаться объяснить. Рассмотрим этот класс (psuedocode):

class Test {
     string somedata = "99";
     string getText() { return somedata; } 
     static string TTT = "0";
}

Теперь у меня следующий прецедент:

Test item1 = new Test();
 item1.somedata = "200";

 Test item2 = new Test();

 Test.TTT = "1";

Каковы значения?

Хорошо

in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99

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

class Test {
         string somedata = "99";
         string getText() { return somedata; } 
  static string TTT = getText(); // error there is is no somedata at this point 
}

. Поэтому возникает вопрос: почему TTT статический или почему getText () не статичен?

Удалите static, и он должен пройти мимо этой ошибки - но не понимая, что делает ваш тип, это только прилипающая штукатурка до следующей ошибки. Каковы требования getText(), которые требуют, чтобы он был нестационарным?

129
ответ дан SpaceCore186 25 August 2018 в 08:25
поделиться

Есть несколько хороших ответов уже с объяснениями, почему смесь нестатического Context метода getText() не может использоваться с вашим static final String.

Хороший вопрос, который нужно задать : почему вы хотите это сделать? Вы пытаетесь загрузить String из своего ресурса strings и заполнить его значение в поле public static. Я предполагаю, что это так, что некоторые из ваших других классов могут получить к нему доступ? Если это так, нет необходимости делать это. Вместо этого передайте Context в свои другие классы и вызовите context.getText(R.string.TTT) из них.

public class NonActivity {

    public static void doStuff(Context context) {
        String TTT = context.getText(R.string.TTT);
        ...
    }
}

И для вызова этого из вашего Activity:

NonActivity.doStuff(this);

Это позволит вам получить доступ к вашему ресурсу String, не используя поле public static.

10
ответ дан dave.c 25 August 2018 в 08:25
поделиться

Этот вопрос не является новым, а существующие ответы дают хороший теоретический фон. Я просто хочу добавить более прагматичный ответ.

getText - это метод абстрактного класса Context, и для его вызова требуется экземпляр его подкласса (Activity, Service, Application или other). Проблема заключается в том, что публичные статические конечные переменные инициализируются до создания любого экземпляра контекста.

Существует несколько способов решить эту проблему:

  1. Сделать переменную членом переменную (поле) Activity или другого подкласса Context, удаляя статический модификатор и помещая его в тело класса;
  2. Держите его статическим и задерживайте инициализацию до более поздней точки (например, в методе onCreate) ;
  3. Сделать локальную переменную вместо фактического использования.
0
ответ дан dev.bmax 25 August 2018 в 08:25
поделиться

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

-1
ответ дан frm 25 August 2018 в 08:25
поделиться

Вы можете либо сделать свою переменную non static

public final String TTT =  (String) getText(R.string.TTT);

, либо сделать метод getText статическим (если это вообще возможно)

2
ответ дан Kellindil 25 August 2018 в 08:25
поделиться

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

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

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

1
ответ дан Krishna 25 August 2018 в 08:25
поделиться

getText является членом вашей активности, поэтому его нужно вызывать, когда «это» существует. Ваша статическая переменная инициализируется, когда ваш класс загружается до создания вашей активности.

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

2
ответ дан Robby Pond 25 August 2018 в 08:25
поделиться

для других, которые нашли это в поиске:

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

ie:

MyClass myclass = new MyClass();

// then later

MyClass.someFunction();

Это, очевидно, статический метод. (хорошо для чего-то) Но то, что я действительно хотел сделать (в большинстве случаев было)

myclass.someFunction();

Это такая глупая ошибка, но каждые пару месяцев я теряю около 30 минут, возившись с vars в Определения «MyClass» для определения того, что я делаю неправильно, когда это действительно так, это просто опечатка.

Смешное примечание: переполнение стека подчеркивает синтаксис, чтобы сделать ошибку действительно очевидной здесь.

6
ответ дан SpiRail 25 August 2018 в 08:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: