У меня есть следующий код:
public class Clase {
public void hazAlgo(String s) {
/* implementación */
}
}
Сейчас я создаю статический метод Clase
для проверки того, что строка не содержит пробелов в конце. Если они у вас есть, вы должны их очистить. Кроме того, необходимо использовать метод hazAlgo
. Итак, у меня есть такой код:
public class Clase {
public void hazAlgo(String s) {
/* implementación */
}
public static String limpiaCadena(String s) {
s = (s == null) ? "" : s.trim();
hazAlgo(s);
}
}
Этот код при компиляции выдает следующее сообщение об ошибке:
$ javac Clase.java
Clase.java:8: error: non-static method hazAlgo(String) cannot be referenced from a static context
hazAlgo(s);
^
1 error
Что я делаю не так?
Проблема заключается в понимании значения
static
. Элементы (атрибуты или методы), объявленные как статические с помощью модификатора,static
можно понимать как элементы, принадлежащие классу, а не экземпляру класса. Другими словами, статические элементы являются глобальными для класса, загружаемого в память. Вот пример использования статического метода:Поскольку эти элементы принадлежат классу, а не экземпляру, вы не можете использовать элементы экземпляра для работы со статическими элементами. Что это значит? Нестатический атрибут или метод нельзя вызвать из статического метода. Давайте рассмотрим метод:
Как решить проблему?
Самое простое решение — не использовать атрибуты и нестатические методы непосредственно внутри статических методов . Это просто ошибка. Если у вас есть ситуация, когда вам «нужно» вызвать нестатический атрибут или метод внутри статического метода, я говорю вам, что вы делаете серьезную ошибку проектирования. Опубликовано предупреждение.
"Простое" решение - изменить нестатический метод на статический, но вы должны понимать смысл изменения (если вы не понимаете смысла, перечитайте с начала ответа).
Есть альтернативы этой проблеме:
Создайте экземпляр класса внутри статического метода:
Используйте это только в том случае, если класс не поддерживает состояние. Однако это странный дизайн и не рекомендуется.
Объявите класс в качестве аргумента статического метода:
Это лучшая альтернатива, чище по дизайну, но вам понадобится больше кода.
Или просто вызовите метод следующим образом:
Взяв ваш опубликованный код, это будет выглядеть так:
Я думаю, что это тоже может сработать: https://docs.google.com/document/d/1oKikiQtWVeFpkrhLrSceermh54-K14oSOYp29WLCHXc/edit?usp=sharing
Чтобы поместить это в код вместо изображений, это будет:
До (с ошибкой)
После (без ошибок):