Static, nonstatic, a nova trieda – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Static, nonstatic, a nova trieda – Java – Fórum – Programujte.comStatic, nonstatic, a nova trieda – Java – Fórum – Programujte.com

 

SVKSuli0
Newbie
6. 12. 2014   #1
-
0
-

ludia potrebujem poradit ako riesite problem ked mate nejake int s ktorim chcete pracovat, nahravat do neho nejake nove cislo a to int potom dat do novej triedy.

ked chcem aby som to int mohol upravovat tak nemoze byt static ale ked chcem aby som ho mohol dat do novej triedy tak musi byt static... ako sa tento problem riesi? neviem si stym rady dik.

Nahlásit jako SPAM
IP: 195.168.26.–
Kit+15
Guru
6. 12. 2014   #2
-
0
-

#1 SVKSuli
Místo třídy použij její instanci.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:894c:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
sleepy
~ Anonymní uživatel
422 příspěvků
6. 12. 2014   #3
-
0
-

#2 Kit
On asi myslel instanciu.

#1 SVKSuli
Predpokladam ze vies co je to konstruktor a settery. Ak nie tu je ukazka:

class Sample {
	private int foo;

	public Sample(int f) {
		foo = f;
	}

	public int getFoo() {
		return foo;
	}

	public void setFoo(int f) {
		foo = f;
	}
}

// A niekde v kode kde mas ten int a vytvaras objekt tak ho predas cez konstruktor:
int myInt = ...
Sample s = new Sample(myInt);
// Alebo ak mas objekt uz vytvoreny a chces v nom len nastavit int:
s.setFoo(myInt);
Nahlásit jako SPAM
IP: 158.195.201.–
SVKSuli0
Newbie
6. 12. 2014   #4
-
0
-

#3 sleepy
dik za odpoved vypada to ze by to mohlo byt to co potrebujem akurat sa musim poriadne pozret na to co su tie gettery a settery lebo som sa snimi este poriadne nestretol a stoho co si tam napisal moc nechapem co a preco tam je.

Nahlásit jako SPAM
IP: 89.173.201.–
ingiraxo+15
Grafoman
6. 12. 2014   #5
-
0
-

#4 SVKSuli
nebo další možnost, budeš předávat referenci na objekt s intem, tím zajištíš, že hodnota bude sdílená mezi všemi objekty a přitom nebude statická 

class Cislo {
    public int hodnota;

    public Cislo(int hodnota) {
        this.hodnota = hodnota;
    }
}

class A { // nejaka hlavni trida A
    public final Cislo cislo;

    public A(int cislo) {
        this.cislo = new Cislo(cislo);
    }
}

class B { // nejaka trida B pouzivajici neco z tridy A
    public final Cislo cislo;

    public B(Cislo cislo) {
        this.cislo = cislo;
    }
}

// pouziti
// v tomto pripade bude cislo v obou instancich ukazovat na
// stejnou hodnotu i kdyz se v jedne hodnota zmeni
A a = new A(100);
B b = new B(a.cislo); // lze predat primo instanci A - zalezi co potrebujes

gettery/settery jsem nedělal, tady je to zbytečný... jinak gettery a settery jak už název říká, slouží k získání nebo nastavení hodnoty, výhodou je, že mohou obsahovat i další logiku, která při přímé nastavení hodnoty není možná.. začínají typicky get nebo set a název by měl korespondovat s názvem fieldu... případně někdy není vhodné umožnit nastavení hodnoty, tak se přidají jen gettery a field zůstane private

v javě a dalších jazycích je to takové, že všechno se dává pokud možno private a publikovat případně nastavovat další vlastnosti jen když jsou nějak potřeba, rozhodně by si neměl definovat fieldy jako public (nepočitám konstanty), vyjímku maji jednoduché "struktůry" / DTO, které slouží pouze na přesun více dat, ale opět záleží na implementaci a okolnostech

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
SVKSuli0
Newbie
6. 12. 2014   #6
-
0
-

#5 ingiraxo
tak dakujem za vase rady ja sa stoho niekedy pokusim vysomarit, ziatal mi to nejak do hlavy nejde asi sa na to musim par krat vyspat :D nech sa to snazim pouzit ako chcem stale to niekde vypisuje problem ze hodnota musi byt static. alebo to vyriesim tak ze budem na vsetko pouzivat jednu triedu a vsetko budem tlacit pod seba nech to ma kludne aj milion riadkov... to bude asi najjednoduchsie.

Nahlásit jako SPAM
IP: 89.173.201.–
ingiraxo+15
Grafoman
6. 12. 2014   #7
-
0
-

#6 SVKSuli
v tom případě to bude i milionkrát nepřehledný, ono né vždy to jde takto použít, hlavně by ses měl držet OOP zásad, třeba to co děláš by se mělo řešit úplně jinak a ptáš se třeba na špatný řešení

klidně sem zkus dát tu část nebo i celej kód (pokud to není dlouhý) nebo ukázku toho, o co se snažíš, vzhledem k tvému dotazu ti takto víc neporadíme, protože nikdo neví co tam patláš :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
SVKSuli0
Newbie
6. 12. 2014   #8
-
0
-

#7 ingiraxo
je mi jasne ze to bude neprehladne preto sa to snazim rozdelit lenze v tomto jazyku mi to pride zbytocne zlozite, ja som bol zvyknuty skor na javasrcipt tam stacilo napisat NazovSriptu.NoveCislo = cislo; a slo to nemusel som riesit blbosti.

ja teda skusim popisat co robym... s prveho jFrame vyberem druh jednotky, pocet, a po stlaceni tlacitka "moja arma" sa otvory novy jFrame kde bude vypisane kolko krat mam tu jednotku a budu tam znasobene jej zakladne staty ako poskodenie zivoty atd, takto isto pridam aj nepratelovy jednotky a potom by som chcel este spravit nieco ako simulaciu boja kde navzajom porovnam moju a nepratelovu armadu.

dole je vidno co by som chcel rozdelit, void enField(), void plField(), a void jednotky() by som chcel nejak prehodit do novych tried napr by som mal zvlast triedu na vyber jednotky podla comboBoxu (kedze tych jednotiek budem mat asi 10x viac tak to by bolo takto nakope extremne neprehladne :D) a potom zvlast triedu kde budem robit prepocty boja.

 snazil som sa to co najlepsie sprehladnit tak dufam ze to neni take zle :)

package simulator;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JTextField;

public class simualtor extends javax.swing.JFrame {

    public static Object jComboBox2;
    private Graphics g;
    int comboBox;
    pridatArmu pridatArmu = new pridatArmu();
    vyhodnotenie vyhodnotenie = new vyhodnotenie();
    
    String druh;
    int pocet;
    int zold = 0;
    int poskodenie = 0;
    int zivoty = 0;
    int regen = 0;
    int odolnosti = 0;

public simualtor() {
        
        initComponents();
    }

private void btnNepriatelskaArmaActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        
        pridatArmu.setVisible(true);
        this.jednotky();
        this.enFields();
        
        pridatArmu.enNepArmada.validate();
        pridatArmu.enNepArmada.repaint();
    }                                                 

    private void btnMojaArmaActionPerformed(java.awt.event.ActionEvent evt) {                                            
        
        pridatArmu.setVisible(true);
        this.jednotky();
        this.plFields();
        
        pridatArmu.plTvojaArmada.validate();
        pridatArmu.plTvojaArmada.repaint();
    }                                           

    private void jComboBox3ActionPerformed(java.awt.event.ActionEvent evt) {                                           
       comboBox = jComboBox3.getSelectedIndex();
    }                                          

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        vyhodnotenie.setVisible(true);
        
        vyhodnotenie.validate();
        vyhodnotenie.repaint();
    }

public static void main(String args[]) {
        
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new simualtor().setVisible(true);
            }
        });
    }

private void enFields() {
        JTextField druhField =new JTextField(druh);
        pridatArmu.enDruh.add(druhField);
        druhField.setEnabled(false);
        druhField.setDisabledTextColor(Color.BLACK);
        druhField.setBackground(new Color(240,240,240));
        
        JTextField pocetField =new JTextField(String.valueOf(pocet));
        pridatArmu.enPocet.add(pocetField);
        pocetField.setEnabled(false);
        pocetField.setDisabledTextColor(Color.BLACK);
        pocetField.setBackground(new Color(240,240,240));
        
        JTextField zoldField =new JTextField(String.valueOf(zold));
        pridatArmu.enZold.add(zoldField);
        zoldField.setEnabled(false);
        zoldField.setDisabledTextColor(Color.BLACK);
        zoldField.setBackground(new Color(240,240,240));
        
        JTextField poskodenieField =new JTextField(String.valueOf(poskodenie));
        pridatArmu.enPoskodenie.add(poskodenieField);
        poskodenieField.setEnabled(false);
        poskodenieField.setDisabledTextColor(Color.BLACK);
        poskodenieField.setBackground(new Color(240,240,240));
        
        JTextField zivotyField =new JTextField(String.valueOf(zivoty));
        pridatArmu.enZivoty.add(zivotyField);
        zivotyField.setEnabled(false);
        zivotyField.setDisabledTextColor(Color.BLACK);
        zivotyField.setBackground(new Color(240,240,240));
        
        JTextField regenField =new JTextField(String.valueOf(regen));
        pridatArmu.enRegen.add(regenField);
        regenField.setEnabled(false);
        regenField.setDisabledTextColor(Color.BLACK);
        regenField.setBackground(new Color(240,240,240));
        
        JTextField odolnostiField =new JTextField(String.valueOf(odolnosti));
        pridatArmu.enOdolnosti.add(odolnostiField);
        odolnostiField.setEnabled(false);
        odolnostiField.setDisabledTextColor(Color.BLACK);
        odolnostiField.setBackground(new Color(240,240,240));
        
    }
    
    private void plFields() {
        JTextField druhField =new JTextField(druh);
        pridatArmu.plDruh.add(druhField);
        druhField.setEnabled(false);
        druhField.setDisabledTextColor(Color.BLACK);
        druhField.setBackground(new Color(240,240,240));
        
        JTextField pocetField =new JTextField(String.valueOf(pocet));
        pridatArmu.plPocet.add(pocetField);
        pocetField.setEnabled(false);
        pocetField.setDisabledTextColor(Color.BLACK);
        pocetField.setBackground(new Color(240,240,240));
        
        JTextField zoldField =new JTextField(String.valueOf(zold));
        pridatArmu.plZold.add(zoldField);
        zoldField.setEnabled(false);
        zoldField.setDisabledTextColor(Color.BLACK);
        zoldField.setBackground(new Color(240,240,240));
        
        JTextField poskodenieField =new JTextField(String.valueOf(poskodenie));
        pridatArmu.plPoskodenie.add(poskodenieField);
        poskodenieField.setEnabled(false);
        poskodenieField.setDisabledTextColor(Color.BLACK);
        poskodenieField.setBackground(new Color(240,240,240));
        
        JTextField zivotyField =new JTextField(String.valueOf(zivoty));
        pridatArmu.plZivoty.add(zivotyField);
        zivotyField.setEnabled(false);
        zivotyField.setDisabledTextColor(Color.BLACK);
        zivotyField.setBackground(new Color(240,240,240));
        
        JTextField regenField =new JTextField(String.valueOf(regen));
        pridatArmu.plRegen.add(regenField);
        regenField.setEnabled(false);
        regenField.setDisabledTextColor(Color.BLACK);
        regenField.setBackground(new Color(240,240,240));
        
        JTextField odolnostiField = new JTextField(String.valueOf(odolnosti));
        pridatArmu.plOdolnosti.add(odolnostiField);
        odolnostiField.setEnabled(false);
        odolnostiField.setDisabledTextColor(Color.BLACK);
        odolnostiField.setBackground(new Color(240,240,240));
        
    }
    
    private void jednotky() {
        int vylPosk =0;
        int vylZiv = 0;
        int vylReg = 0;
        int vylOdol = 0;
        pocet =(int) jSpinner1.getValue();
        vylReg = 1 * (int) plusReg.getValue();
        
        switch(comboBox) {
            case 0: druh = "kostlivec";zold = 1;poskodenie = 15;
                    zivoty = 35;regen = 10;odolnosti = 20;vylPosk = 1;vylZiv = 1;
                break;
            case 1: druh = "fanatik";zold = 3;poskodenie = 50;
                    zivoty = 100;regen = 10;odolnosti = 20;vylPosk = 2;vylZiv = 4;
                break;
            case 2: druh = "nekromancer";zold = 3;poskodenie = 70;
                    zivoty = 130;regen = 30;odolnosti = 50;
                break;
            case 3: druh = "kostrovy golem";zold = 12;poskodenie = 170;
                    zivoty = 540;regen = 25;odolnosti = 40;vylPosk = 3;
                    vylZiv = 15; vylOdol = 5;
                break;
            case 4: druh = "sukubus";zold = 20;poskodenie = 400;
                    zivoty = 700;regen = 25;odolnosti = 40;vylPosk = 10;vylZiv = 20;
                break;
            case 5: druh = "rytier smrti";zold = 20;poskodenie = 280;
                    zivoty = 1350;regen = 0;odolnosti = 30;vylPosk = 10;
                    vylZiv = 30; vylOdol = 3;
                break;
            case 6: druh = "nocna mora";zold = 40;poskodenie = 720;
                    zivoty = 2100;regen = 10;odolnosti = 40;vylPosk = 25;vylZiv = 50;
                break;
            case 7: druh = "veza nemrtvych";zold = 0;poskodenie = 850;
                    zivoty = 5500;regen = 0;odolnosti = 0;
                break;
        }
        poskodenie = (poskodenie + (vylPosk * (int) plusPosk.getValue())) * pocet;
        zivoty = (zivoty + (vylZiv * (int) plusZiv.getValue())) * pocet;
        regen = regen + vylReg;
        odolnosti = odolnosti + (vylOdol * (int) plusOdol.getValue());
        zold = zold * pocet;
    }
}

Nahlásit jako SPAM
IP: 195.168.26.–
Kit+15
Guru
6. 12. 2014   #9
-
0
-

#8 SVKSuli
No nazdar. Proč to nepíšeš objektově, ale procedurálně?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ingiraxo+15
Grafoman
6. 12. 2014   #10
-
0
-

#8 SVKSuli
takže...

1) ta třída "pridatArmu" je spatne, nevim sice co přesně obsahuje, ale názem je úplně špatně, rozhodně by neměla začínat malým písmenem a mělo by to být podstatné jméno (to same pro vyhodnocenie)

2) je videt, ze s OOP si moc nepřišel do styku, javascript je hnusnej jazyk, protože ti dovoli prakticky všechno a většinou to i projde, je potřeba vytvořit více objektů, pro každej reálnej předmět, by měla vzniknout speciální třída

Nejprve než začneš bušit do klávesnice, tak by sis měl promyslet, co všechno budeš potřebovat vytvořit, jinak se dostaneš do toho stavu, že všechno bude v jedné třídě nebo potom toho bude tolik, že refactor bude celkem vopruz

3) máš tam generování vzhledu - tomu se bohužel moc dobře nevyhneš a bylo by potřeba to udělat jinak, měl by vzniknout speciální Frame, kterej bude sloužit na konkrétní účel - Frame na boj, na info o postavě třeba nebo na další prvky.. potom samozřejmě hlavní Frame, který to bude všechno řídit.

Tímhle se vyhneš přeplácání.. jinými slovy by Frame měl sloužit POUZE pro vykreslení dat, logika by měla být oddělená

4) koukám, že ta metoda jednotky() je taková "hurá akce", sám si psal, že bude víc druhý jednotek, ok.. proč neudělat třídu "Jednotka" a od ní nepodědit další speciální jednotky? Všechny jednotky budou mít určité vlastností sdílené (pokud všechny, tak řešit přes enum) 

// definovane typy jednotek
enum TypJednotky
{
    KOSTLIVEC("Kostlivec", Kostlivec.class),
    FANATIK("Fanatik", Fanatik.class);

    private String nazev;
    private Class<? extends Jednotka> clazz;

    private TypJednotky(String nazev, Class<? extends Jednotka> clazz)
    {
        this.nazev = nazev;
        this.clazz = clazz;
    }

    public String getNazev()
    {
        return nazev;
    }

    // vytvori instanci jednotky.. POZOR - jednotky musi mit vzdy bezparametricky konstruktor
    @SuppressWarnings("unchecked")
    public <T extends Jednotka> T vytvor()
    {
        try {
            return (T) clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            return null;
        }
    }

    // prepsanim metody toString() docileme, ze vypis bude nas "getNazev()" a ne puvodni "name()"
    @Override
    public String toString()
    {
        return nazev;
    }
}

// KAZDA jednotka MUSI vychazet z teto tridy,
// protoze zakladni vlastnosti budou mit vsechny jednotky stejny
abstract class Jednotka
{
    // nutno nastavit ve vsech potomcich a tento typ se nikdy menit nebude - proto final
    private final TypJednotky typ;
    protected int zivoty;
    protected float utok;

    public Jednotka(TypJednotky typ)
    {
        this.typ = typ;
        zivoty = 100; // vychozi pocet zivotu pro vsechny jednotky
        utok = 0;     // to same jen utok
    }

    // typ nesmi mit setter !! (nedava to smysl)
    public TypJednotky getTyp()
    {
        return typ;
    }

    public int getZivoty()
    {
        return zivoty;
    }

    public void setZivoty(int zivoty)
    {
        this.zivoty = zivoty;
    }

    public float getUtok()
    {
        return utok;
    }

    public void setUtok(float utok)
    {
        this.utok = utok;
    }

    // vlastni vypis jednotky pres toString()
    @Override
    public String toString()
    {
        return String.format("%s (%s Zivotu, %s Utok)", typ, zivoty, utok);
    }
}

// specialni jednotka Kostlivce
// muze definovat dalsi vlastnosti, ktery se budou tykat POUZE kostlivce
class Kostlivec extends Jednotka
{
    public Kostlivec()
    {
        super(TypJednotky.KOSTLIVEC);
        zivoty = 250;
        utok = 5.2f;
    }
}

// to same jako pro kostlivce
class Fanatik extends Jednotka
{
    public Fanatik()
    {
        super(TypJednotky.FANATIK);
        zivoty = 160;
        utok = 11f;
    }
}

public class Hra
{
    public static void main(String[] args)
    {
        JComboBox<TypJednotky> cbox = new JComboBox<>(TypJednotky.values());

        cbox.setSelectedIndex(1); // vyberu neco v comboBoxu
        // zde to klidne muzu pretypovat, protoze vim, jaky typ tam je
        TypJednotky typ = (TypJednotky) cbox.getSelectedItem();
        Jednotka jednotka = typ.vytvor(); // vytvori jednotku

        // v pripade, ze by typy jednotek meli specialni vlastnosti, tak to lze odlisit takto
        // ale pro tento pripad by uz bylo lepsi udelat factory, nez vytvaret jednotky takto,
        // pokud budou mit vsechno jednotky stejny vlastnosti, tak takto je to idealni
        if (typ == TypJednotky.FANATIK) {
            Fanatik fanatik = typ.vytvor();
        }
        System.out.println(jednotka); // vypise
    }
}

dost záleží taky na tom, jak si to celý představuješ a jakým směrem se to bude rozrůstat, tohle řešení co jsem napsal je jen jedno z vícero

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
SVKSuli0
Newbie
6. 12. 2014   #11
-
0
-

#10 ingiraxo
viem ze som to mal vsetko rozdelit na objekty a neplacat to vsetko na kopu ale nedarilo sa mi to spravit tak som to spravil aspon tak ako som to vedel aby to aspon bolo potom ked budem vediet to zmenim.

chcem sa totiz ucit javu stilom pokus omyl, vymyslel som si projekt ktory chcem spravit a skusam a nie pasivne citat knihy alebo kopirovat navody. to by ma bavilo asi tak mesiac.

skusim sa na to pozret a prerobit to moje podla tvojej ukazky :) 

Nahlásit jako SPAM
IP: 195.168.26.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 41 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý