2014-01-08 3 views
1

Я пытаюсь инициализировать переменную внутри конструктора класса, но IDE показывает следующее предупреждение:Каким должен быть правильный способ назначения значения статической переменной?

The static field SoapClient.url should be accessed in a static way.

Можете ли вы проверить мой код ниже? Каким должен быть правильный способ инициализации статической переменной? Должен ли я игнорировать предупреждение или я должен просто сделать переменную нестатической?

Спасибо.

public class SoapClient { 
    private static String url; 

    public SoapClient(String url) { 
     this.url = url; 
    } 
} 
+0

ли вы хотите быть 'static' ..? –

+4

Вы уверены, что каждый новый экземпляр «SoapClient» может изменить статическое поле 'url'? –

+0

+1 для любви к вашей кошке. – Maroun

ответ

1

Когда переменная static, это означает, что вы будете имеют один url для всех экземпляров, а не за объект. Вы не хотите, чтобы каждая конструкция объекта менялась url. Однако, если вы все еще хотите это сделать, вы можете получить к нему доступ, как SoapClient.url.

(В вашем коде url всегда будет содержать значение последнего построенного объекта).

3

Правильный путь статический путь:

SoapClient.url = "" 

Но здесь, вероятно, нужно регулярное поле:

public class SoapClient { 
    private final String url; 

    public SoapClient(final String url) { 
     this.url = url; 
    } 
} 
0

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

Основная проблема, однако, связана с назначением статической переменной внутри конструктора. Какое поведение вы желаете? Вам действительно нужно, чтобы каждый раз, когда вы строите новый объект SoapClient, статический URL-адрес переписывается для КАЖДЫЙ экземпляр SoapClient? Или вам нужен каждый клиент для хранения другого URL-адреса (что звучит лучше для меня)? В этом случае я бы просто реализовать поле URL-адрес в качестве обычного поля, как кто-то предложил (просто вынуть static модификатор из декларации поля)

0

Есть два способа

public Login(String url) { 
    Login.url = url; 
} 

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

public static void setUrl(String url) { 
    Login.url = url; 
} 
0

Статическая переменная специфична для класса, в то время как переменная-член специфична для экземпляра класса. Когда мы думаем о SoapClient, вы можете подумать, что его URL-адрес относится к каждому другому экземпляру класса, так как каждый SoapClient может иметь другой URL-адрес.

Это означает, что лучше удалить статическое ключевое слово из URL. Если вы используете URL-адрес в качестве переменной-члена, вы правильно его проинструктировали.

Если вы хотите использовать его в качестве статической переменной, используйте:

SoapClient.url = url; 
0

Взятые from Oracle:

Иногда вы хотите иметь переменные, которые являются общими для всех объектов. Это достигается с помощью статического модификатора. Поля, которые имеют статический модификатор в своем объявлении, называются статическими полями или переменными класса . Они связаны с классом, а не с любым объектом . Каждый экземпляр класса использует переменную класса, которая равна в одном фиксированном месте в памяти. Любой объект может изменить значение переменной класса , но переменные класса также можно манипулировать без , создавая экземпляр класса.

Так у вас есть два варианта:

public class SoapClient { 
    private String url; 

    public SoapClient(String url) { 
     this.url = url; 
    } 
} 

Или:

public class SoapClient { 
    private static String url = "http://stackoverflow.com"; 

    public SoapClient() { 

    } 
} 
Смежные вопросы