2015-01-06 4 views
2

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

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

public class NewBody { 

public static int distanceScale = 5; 

    public int x, y; 
    public float xMeter = x * distanceScale; 
    public float yMeter = y * distanceScale; 

    public NewBody(int x, int y){ 
     this.x = x; 
     this.y = y; 
    } 

    public void pixToMeter(){ 
     this.xMeter = distanceScale * this.x; 
    } 

Если я не называю pixToMeter() и просто попробовать использовать «экземпляр. xMeter ", он просто возвращает vaulue 0, хотя я уже установил переменную x в конструкторе.

Итак, мой вопрос: есть ли способ правильно установить переменные без вызова метода для этого? Это кажется крайне ненужным, поскольку я даже не передаю ему параметр.

Извините за мой бедный английский, я надеюсь, вы понимаете, что я пытаюсь сказать.

ответ

4

Инициализация xMeter выполняется, когда x по-прежнему равен нулю.

Это то, что происходит на самом деле:

public NewBody(int x, int y) { 
    // All fields are zeroed: 0, null, 0.0. 

    super(); // Object constructor, as Object is the parent class. 

    // Those fields that are initialized: 
    xMeter = this.x * distanceScale; // 0.0f * 5 
    yMeter = this.y * distanceScale; 

    // The rest of the constructor: 
    this.x = x; 
    this.y = y; 
} 

Для зависимости значения:

public final void setX(int x) { 
    this.x = x; 
    xMeter = this.x * distanceScale; 
} 

И применять СУХОЙ принцип (не повторяться): один мог упасть инициализацию xMeter и вместо этого вызовите setX (x) в конструкторе.

При вызове в конструкторе важно сделать setX окончательный, то есть: нельзя переопределять.

+0

@tom: Что опечатку? – Makoto

+0

@ Макото Вы имеете в виду 'Yhe'? : P – Tom

+2

Это то, что я получаю за еду сэндвич с мороженым и копирование. – Makoto

2

Источником проблемы здесь:

public float xMeter = x * distanceScale; 

Проблема в том, что вы инициализации этой переменной экземпляра вне конструктора. В результате, так как x инициализируется 0, результат вашего умножения также 0.

Если вам нужно xMeter и yMeter инициализируется значением, основанным на x или y, просто объявить их, как вы это делали в других областях:

public int xMeter; 

и инициализировать их значения в конструкторе:

public newBody(int x, int y){ 
    // initialize x and y ... 
    this.xMeter = x * distanceScale; 
+0

Поздно к вечеринке, которую я вижу. Ввод на моем телефоне. –

+1

Вы хотя бы дадите решение. –

+0

Спасибо! В этом есть смысл. Однако у меня есть один вопрос, если вы не возражаете. Что произойдет, если я хочу изменить значение x с помощью простого метода, например: instance.setX (int x) {this.x = x}? Переменная xMeter, похоже, не обновляется, она все еще печатает значение, которое было инициализировано с помощью – supsupsupsup

1

Как уже упоминалось другие, когда xMeter инициализирован, строител ctor еще не вызывается, а x по-прежнему 0, поэтому значение xMeter равно 0.

Чтобы изменить это, необходимо обновить xMeter «s значения сразу x инициализируются в конструкторе, например, так:

public NewBody(int x, int y){ 
    this.x = x; 
    this.y = y; 

    // update x and y meter 
    xMeter = x * distanceScale; 
    yMeter = y * distanceScale; 
} 

Однако, вы упомянули, как вы хотите xMeter обновлять каждый раз, когда x изменяются, а , Поскольку это соответствует вашему текущему коду, этого не произойдет.Тем не менее, моим предложением было бы создать метод , чтобы изменить значение xy), а также в этих методах также обновить значения xMeter и yMeter. Таким образом, всякий раз, когда вы хотите изменить x, вызовите методы, и он также обновит ваши другие значения.

Попробуйте добавить эти методы и изменить свой конструктор к этому:

// called setter methods 
public void setX(int x) { 
    this.x = x; 
    this.xMeter = x * distanceScale; 
} 
public void setY(int y) { 
    this.y = y; 
    this.yMeter = y * distanceScale; 
} 

// constructor 
public NewBody(int x, int y){ 
    setX(x); 
    setY(y); 
} 
+0

Thaank you! На самом деле гений, я бы хотел, если бы – supsupsupsup

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