Skocz do zawartości
  • 0

Java obiekty itd.


Wakal

Pytanie

Witam, już umiem tworzyć podstawowe rzeczy w javie taki jak potegowanie, warunki if, petle, switch, itd... Ale nie ogarniam obiektów, wiem do czego są i jakie jest ich przeznaczenie, ale, nie ogarniam po co dawać je w klasie prywatnej, a do nich akcesory i mutatory, może ktoś wytłumaczyć, lub polecić jakiś dobry poradnik?

Za wszystkie odp. z góry dzięki!

EDIT: Chciałbym się jeszcze dowiedzieć do czego przydadzą mi się tabele(czy tam tablice) znaków.

Edytowane przez Wakal
Odnośnik do komentarza
https://skript.pl/temat/25284-java-obiekty-itd/
Udostępnij na innych stronach

1 odpowiedź na to pytanie

Rekomendowane odpowiedzi

  • 0
Ale nie ogarniam obiektów, wiem do czego są i jakie jest ich przeznaczenie, ale, nie ogarniam po co dawać je w klasie prywatnej

coś tu mącisz, klasa definuje typ, a instancja tego typu (czyli klasy) to obiekt.

No i w javie z obiektów to korzystamy prawie wszędzie, jak robisz coś statyczego to w większości przypadków robisz to źle, dodatkowo jak robisz wiele mapek po tym samym kluczu - to pewnie też jest to źle, np:
 

private final Map<UUID, Double> playerMoney = new HashMap<>();
 private final Map<UUID, Integer> playerPoints = new HashMap<>();

to jest to zdecydowanie źle i do dupy, powinien być użyty właśnie specjalny obiekt:

public class MyPluginUser {
    private final UUID uuid;
    private double money;
    private int points;

    public double getMoney() {
        return this.money;
    }

// + konstruktor i inne gettery/settery tam gdzie potrzeba i inne metody
}

i wtedy robi się jedną mapkę UUID -> MyPluginUser.

A gettery i settery są dla hermetyzacji, tak że w razie czego możesz np zmienić sposób w jaki przechowujesz punkty a reszta kodu zostaje taka sama, np wyobraź sobie taki kod jak wyżej, oraz ze teraz rezygnujesz ze wspierania pieniędzy w swoim pluginie i przerzucasz to do innego pluginu i zamiast musieć edytować caly plugin zmieniam tylko getter na np:

public double getMoney() {
    return JavaPlugin.getPlugin(InnyPlugin.class).getUsers().getUser(this.uuid).getMoney();
}

i kompatybilność zachowana + nie trzeba edytować żadnego innego miejsca w kodzie.

 

Do tego nie nalezy wcale dawać getterów i setterów do wszystkiego, tak na prawdę to tym mniej tym lepiej, a już tym bardziej nie powinno się tworzyć kodu potem tylko na tych getterach/setterach, np mając własny system komend nie powinno się potem sprawdzać czy wpisana komenda jest taka sama jak nazwa komendy lub jej aliasy na np zasadzie: 

String usedCommand = ...; // to co wpisal gracz jako nazwę komendy
for (MyCommand command : myCommands) { // zakladamy że mamy jakąś listę tych komend
    if (command.getName().equals(usedCommand) || command.getAliases().contains(usedCommand)) {
        command.use(player, args, cokolwiek);
    }
}

Tylko poprawnie MyCommand powinno mieć metodę która sama zrobi te sprawdzenia, więc końcowy kod wygląda tak:
 

String usedCommand = ...; // to co wpisal gracz jako nazwę komendy
for (MyCommand command : myCommands) { // zakladamy że mamy jakąś listę tych komend
    if (command.isMatchingName(usedCommand)) {
        command.use(player, args, cokolwiek);
        break;
    }
}

Wtedy nawet nie ma potrzeby tworzenia gettera nazwy czy aliasów. (no ale w tym wypadku może się pojawiać potrzeba z innego powodu, np tworzenia listy komend czy coś)
A plusem takiego zapisu jest fakt że to już sama komenda definiuje jak powinna być używana, to ona decyduje czy ignoruje wielkość liter czy nie, więc osoba używająca tego juz nie musi o tym myśleć.

PS: przechowywanie kasy w double to tak na prawdę średnio dobry pomysł, no ale to tylko gra to nikt prawdziwej kasy nie straci.

Odnośnik do komentarza
https://skript.pl/temat/25284-java-obiekty-itd/#findComment-167807
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...