2015-03-02 3 views
2

У меня есть класс Fraction, используя ключевое слово это в моем конструкторе:Java «это» ключевое слово правильное использование

public Fraction(int numerator, int denominator) 
{ 
    this.numerator = numerator; 
    this.denominator = denominator; 
    adjustSigns(); 

    if(this.denominator == 0) 
    { 
    throw new FractionException(" Undefined Fraction "); 
    } 
} 

У меня также есть метод:

public FractionInterface multiply(FractionInterface secondFraction) 
{ 
    Fraction second = (Fraction) secondFraction; 
    Fraction answer = new Fraction ((numerator * second.numerator), (denominator * second.denominator));   
    answer.reduceToLowestTerms(); 
    return answer; 
} 

Описанный выше метод отлично работает, когда я компилирую и запускать, но так вот эта версия:

public FractionInterface multiply(FractionInterface secondFraction) 
{ 
    Fraction second = (Fraction) secondFraction; 
    Fraction answer = new Fraction ((this.numerator * second.numerator), (this.denominator * second.denominator));  
    answer.reduceToLowestTerms(); 
    return answer; 
} 

Мой вопрос в том, какой из них правильный? Если использовать ключевое слово this этого конструктора в моем конструкторе, я также должен использовать его в своих методах? Опять же, они оба отлично работают и делают то, что они должны делать, но я хочу знать, каким образом это правильный путь. Благодарю.

+0

t он использует 'this' в конструкторе (или сеттерах), как правило, используется для устранения неоднозначности имен переменных –

+1

В терминах' this', оба являются правильными. Большая проблема с реализациями «multiply» заключается в том, что они ** лежат **: они утверждают, что принимают что-либо, реализующее «FractionInterface», но на самом деле они принимают только экземпляры подклассов «Фракция» и «Фракция». Правильная реализация будет работать с 'FractionInterface' (или объявить аргумент типа' Fraction' вместо). –

+0

Но на 'this': Есть две школы мысли об использовании' this' в тех случаях, когда это необязательно: школа, которая считает, что, поскольку это необязательно, это просто лишний текст/текст, и школа, которая считает, что это полезно для ясность. Если вы не используете 'this', легко думать, что' numerator' является аргументом функции или локальной переменной, а не полем экземпляра. –

ответ

4

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

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

public Fraction(int num, int denom) 
{ 
    numerator = num; 
    denominator = denom; 
    ... 
} 

Обе multiply версии совпадают.

+1

Например, обе реализации метода «умножения» являются «правильными» (отличными от этого приведения!). –

+0

Почему это неправильно? по словам моего профессора, мне пришлось сбрасывать ссылочный параметр FractionInterface в фракцию, если я хочу использовать его как фракцию. – lrod408

+0

@ lrod408 У литого есть возможность бросать ClassCastException, так как вы не проверяете, что 'secondFraction' является' instanceof Fraction' перед его литьем. Если несколько классов реализуют 'FractionInterface', для некоторых из них бросок не удался. – Eran

2

Оба упомянутых вами случая будут работать нормально.

Использования this является хорошей практикой, так как его более удобным для чтения из-за наше английское мышление, когда мы говорим this.some_variable, мы получим ментальный образ some_variable внутри текущего класса

this ключевого слова также полезно в предотвращении переменного затенения

1

Я думаю, что у вас есть путаница в том, как работает это «ключевое слово».

Позвольте мне дать вам пример:

Это

public class testing { 
    private int a; 
    private int b; 

    testing(int a,int b){ 
     this.a = a; 
     this.b = b; 
    } 
} 

так же, как:

public class testing { 
    private int a; 
    private int b; 

    testing(int x,int y){ 
     this.a = x; 
     this.b = y; 
    } 
} 

Что, конечно, для второго было бы легче поставить, если мы делаем это примерно так:

public class testing { 
    private int a; 
    private int b; 

    testing(int x,int y){ 
     a = x; 
     b = y; 
    } 
} 
Смежные вопросы