• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Modyfikator dostępu - private

Cloud VPS
0 głosów
576 wizyt
pytanie zadane 19 stycznia 2018 w Java przez must Bywalec (2,980 p.)

Hej, mam problem z logiką(?) programu.

W klasie 

PlayerChanger

mam metodę 

getTurn

chce by była ona prywatna, poniewaz tak to kazdy ma do niej dostęp i moze zmienic przypisaną do niej literę. Jak to obejść, bo teraz nie moge uzyc tej klasy w klasie 

Game

z tego wzgledu ze ma ona modyfikator 'private. Czy mam stworzyć getTurn w klasie Game, czy jak to zrobić?

 

Klasa PlayerChanger

package tictactoe;

public class PlayerChanger
{

    public char turn = 'X';

    public void changePlayer()
    {
        if (turn == 'X')
        {
            turn = 'O';
        }
        else
        {
            turn = 'X';
        }
    }

    private char getTurn()
    {
        return turn;
    }

}

Klasa Game:

package tictactoe;

import java.util.Scanner;

class Game {
    private BoardPrinter map = new BoardPrinter();
    private PlayerChanger playerChanger = new PlayerChanger();
    private ConditionsChecker conditionsChecker = new ConditionsChecker();
    private Scanner input = new Scanner(System.in);
    private char[][] board = new char[3][3];
    private int row, col;


    void StartGame() {

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                board[i][j] = '_';
            }
        }

        map.printBoard(board);
        while (!(conditionsChecker.checkIfWinner(board))) {

            row = input.nextInt();
            col = input.nextInt();

            if (conditionsChecker.checkIfOutOfBoard(row, col)) {

            } else {

                if (conditionsChecker.checkIfOccupied(row, col, board)) {

                }
                else {

                    board[row - 1][col - 1] = playerChanger.getTurn;
                    map.printBoard(board);
                    playerChanger.changePlayer();

                }
            }
        }
        playerChanger.changePlayer();
        System.out.println("The winner is " + playerChanger.getTurn);
    }
}

 

2 odpowiedzi

+1 głos
odpowiedź 19 stycznia 2018 przez mbabane Szeryf (79,260 p.)
wybrane 19 stycznia 2018 przez must
 
Najlepsza
public char getTurn() 
{ 
     return turn; 
}

Spokojnie, taką konstrukcja nie będziesz wstanie nadpisać zmiennej turn.

To o czym piszesz grozi np. w przypadku List bo wtedy możesz zrobić tak:

class KlasaZLista
{
      private List<String> lista;

     public KlasaZLista()
     {
           this.lista = new ArrayList<>();
           this.lista.add("Jakis string");
      }
      public List<String> getLista()
      {   
          return lista;
      }
}


//uzycie
KlasaZLista kzl = new KlasaZLista();
println(kzl.getLista());

//a teraz, teoretycznie nie ma mozliwosci zmiany listy ale...
kzl.getLista().add("Kolejny string");
println(kzl.getLista()); // co pokaze ?

to println to jest System.out.println().

komentarz 19 stycznia 2018 przez must Bywalec (2,980 p.)

Podobno w klasie 

Game

jest mozliwość 

playerChanger.turn = 'F';

 

1
komentarz 19 stycznia 2018 przez mbabane Szeryf (79,260 p.)

A przepraszam, z przyzwyczajenia nie zauważyłem.

Zmień w tej klasie zmienną turn tak aby była prywatna i po krzyku.

 

komentarz 19 stycznia 2018 przez must Bywalec (2,980 p.)
To znaczy? W klasie PlayerChanger mam zmienić na private i co :P Dalej nie działa.

Poza tym nie rozumiem określenia jak ktoś Z ZEWNĄTRZ może dostać dostęp do mojej metody jezeli mam ja na nie private.... Nie czaje tego kompletnie.... /// to juz tak poza tematem

 

 

 

///edit nie dałem nawiasów :P

Możesz mi wytłumaczyć dlaczego wystarczyło zmienic tę zmienną na prywatną?
komentarz 19 stycznia 2018 przez mbabane Szeryf (79,260 p.)

Ma być tak:

public class PlayerChanger
{
 
    private char turn = 'X';
    
    //metoda changePlayer

    public char getTurn()
   {
         return turn;
   }
}

Poczytaj o hermetyzacji w kontekście programowania obiektowego. Jak nie będziesz rozumiał po przeczytaniu wtedy pisz i będziemy radzić.

+1 głos
odpowiedź 19 stycznia 2018 przez Wiciorny Ekspert (281,530 p.)
Problem rozwiązujący w takich przypadkach to zrozumienie:

czym są właśnie gettery i settery :)

http://akubiak.pl/2016/04/03/java-gettery-settery-i-project-lombok/

dzięki nim- mamy dostęp z zewnątrz nawet do prywtanych zmiennych

Podobne pytania

0 głosów
2 odpowiedzi 497 wizyt
pytanie zadane 30 marca 2018 w Java przez neos Początkujący (320 p.)
0 głosów
1 odpowiedź 241 wizyt
pytanie zadane 18 grudnia 2022 w PHP przez kordix Gaduła (3,910 p.)
0 głosów
1 odpowiedź 364 wizyt
pytanie zadane 25 kwietnia 2021 w Bezpieczeństwo, hacking przez MrMoon Użytkownik (960 p.)

93,464 zapytań

142,459 odpowiedzi

322,730 komentarzy

62,844 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...