Pytanie o nazewnictwo zmiennych oraz anonimową klasę wewnetrzną

0

Witajcie,

co oznacza i dlaczego stosowana jest dodatkowa litera w nazwie zmiennej (tutaj 'm') np.

private Button mTrueButton;

oraz dlaczego tworzona jest tutaj anonimowa klasa wewnętrzna? Rozumiem, że tworzy ona nową klasę bez nazwy i obiekt ale po co / dlaczego...?


 mFalseButton = (Button) findViewById(R.id.false_button);
        mFalseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

0

Bo literki m w zmiennych są super.
Zmiast tworzenia klasy w innym miejscu, tworzy się klasa wewnętrzna która dodaje po prostu 'nasłuchiwanie' do przycisku, wykonuje czynności po kliknięciu go.

3
Kubs napisał(a):

co oznacza i dlaczego stosowana jest dodatkowa litera w nazwie zmiennej (tutaj 'm') np.

private Button mTrueButton;

Przedrostek "m" to zaszłość po notacji węgierskiej. Zależy od standardów w projekcie czy jest stosowana czy nie. W Androidzie trochę się to przyjęło, bo jest używane w AOSP. Niemniej nie ma ona żadnej wartości dzisiaj przy wsparciu ze strony IDE i narzędzi do recenzji kodu.

Kubs napisał(a):

oraz dlaczego tworzona jest tutaj anonimowa klasa wewnętrzna? Rozumiem, że tworzy ona nową klasę bez nazwy i obiekt ale po co / dlaczego...?

 mFalseButton = (Button) findViewById(R.id.false_button);
        mFalseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

W sumie to sam sobie odpowiedziałeś. Tworzysz obiekt, który będzie reagował na kliknięcia w przycisk mFalseButton. Czemu tak? Bo jeżeli nie ma żadnej skomplikowanej logiki dla kliknięcia (i z reguły w samym kliknięciu nie powinno), to można od razu przekazać prosty obiekt, który zrobi co chcemy, bez potrzeby tworzenia osobnej klasy. Może pytasz dlatego, że jesteś przyzwyczajony do, że Activity czy Fragment implementują View.OnClickListener.

public class MyActivity extends Activity implements View.OnClickListener {
  void onCreate(@Nullable Bundle inState) {
    super.onCreate(inState);
    Button falseButton = findViewById(R.id.false_button);
    falseButton.setOnClickListener(this);
  }

  @Override
  public void onClick(View view) {
    // Do something
  }
}

Jest to raczej antywzorzec, bo robisz ze swojego Activity klasę, która powoli zaczyna odpowiadać za wszystko. Dodatkowo przestaje to być czytelne, gdy masz kilka przycisków, które muszą być obsłużone w różny sposób. Jeżeli pytasz dlatego, że wcześniej ustawiałeś to przez XML android:onClick=handleOnClick, to od razu mówię, że tak w ogóle nie powinieneś robić, bo jest to chyba najgorszy możliwy sposób - na dłuższą metę jest to bardzo nieczytelne, nieodporne na zmiany i relatywnie powolne w porównaniu do innych sposobów.

0

Dodam, że m to skrót od słowa member.

0

@Michał Sikora:

Ty jak zwykle na posterunku i z obszerną odpowiedzią. :) Czytam ,że gdy wpiszemy ten prefix 'm' w ustawienia->edytor->code style->java->field ,to gdy będziemy tworzyć getter dla zmiennej mTextResId to wygeneruje się metoda o nazwie getTextResId a nie getMTextResId.

Możesz proszę odnieść się do tego, bo nie za bardzo rozumiem logiki stojącej za tym.

0

@Kubs - po prostu wygeneruje się nazwa metody w której ten prefix "m" zostanie pominięty, tak żeby nazwa metody była ładna.

0

Spytam Was jeszcze tutaj (żeby nie rozpoczynać nowego tematu z zapytaniem o jedną linijkę kodu) co oznacza % w tym przypadku:


mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;

1

% to operator modulo, czyli reszta z dzielenia calkowitego, np:

5 % 3 = 2
6 % 3 = 0

2

Nie do końca. Jeżeli ktoś korzystałby z matematycznej definicji, to % nie pozwala na negatywną resztę z dzielenia i mógłby się naciąć, ponieważ Java taką dopuszcza. Metoda poniżej będzie niepoprawna dla liczb ujemnych.

boolean isOdd(int n) {
  return n % 2 == 1;
}
0

@Michał Sikora:

może teraz będzie łatwiej wyjaśnić Ci tą linijkę kodu z %

mNextButton.setOnClickListener (new View.OnClickListener() {
            @Override
            public void onClick (View v) {
                mCurrentIndex = (mCurrentIndex +1) % mQuestionBank.length;
                int question = mQuestionBank [mCurrentIndex].getTextResId();
                mQuestionTextView.setText(question);

0

Ten kod to jakaś bzdura. Te modulo moim zdaniem jest tam kompletnie niepotrzebne. Indeks pytania nigdy nie będzie większy niż rozmiar listy z pytaniami, więc wynik modulo to będzie zawsze indeks +1.

0

Myślę jeszcze.. jak to działa..

Czyli mając 5 pytań działa to tak:

mCurrentIndex = (mCurrentIndex +1) % mQuestionBank.length;

                // 0+1 % 5 = 1
                // 1+1 % 5 = 2
                // 2+1 % 5 = 3
                // 3+1 % 5 = 4
                // 4+1 % 5 = 0

czyli pozycja z indeksu 0 powinna być wyświetlana na końcu ,a gdy uruchomię ten kod to,tekst z indeksu 0 wyświetlany jest na początku.

Dlaczego?

0

Może najpierw pobierasz indeks pytania do wyświetlenia, a potem dopiero go zwiększasz?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.