Funkcja zwracająca więcej zmiennych

0

Pytanie szkoleniowe na podstawie kodu poniżej.

Interesuje mnie taka kwestia - jak można stworzyć funkcję/metodę zwracającą zmienne do głównej klasy, tak by zwrócić więcej niż jedną zmienną? W poniższym przypadku nadaje wartość dla zmiennej "imie". Czy dla każdej innej zmiennej (np. "nazwisko" lub "wiek") trzeba tworzyć osobne funkcje/metody? W przedstawionym, teoretycznym przykładzie jest to proste. Ale chodzi mi np. o złożoną metodę, która będzie pobierała z pliku xml szereg wartości.

Dziękuję za pomoc.

 
public class Glowna {

		private static String imie;
		private static String nazwisko;
		private static int wiek;
		
	
	public static void main(String args[]){

		 Procedury proceduryObiekt = new Procedury();
                       
		 imie = proceduryObiekt.podajImie();
	                  
		 
		 
		System.out.println(imie);
		System.out.println(nazwisko);
		System.out.println(wiek);
		
	}
}

public class Procedury {
	
	public String nadaneImie;
	
		public String podajImie(){
		
		nadaneImie = "jan";
		
		return nadaneImie;
	}
	
	
}
2

Możesz sobie stworzyć klasę zawierającą interesujące Cię pola a potem metodę, która zwraca obiekt tej klasy:

public Person foo() { //... } 

następnie w interesującej Cię klasie zrobić coś w stylu:

// ... 

//konstruktor
public Employer(){
Person p = foo();
this.Age = p.Age;
}
 
0

Niżej masz prosty przykład parsowania. Może Ci to pomoże.

<accounts>
    <account>
        <name>Witold</name>
        <surname>Gombrowicz</surname>
        <age>11</age>
    </account>

    <account>
        <name>Adam</name>
        <surname>Mickiewicz</surname>
        <age>22</age>
    </account>

    <account>
        <name>Bolesław</name>
        <surname>Prus</surname>
        <age>33</age>
    </account>
</accounts>
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

class Account {
    private String name;
    private String surname;
    private Integer age;

    public void setName(String name) {
        this.name = name;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Account{" +
                "name='" + name + '\'' +
                ", surname='" + surname + '\'' +
                ", age=" + age +
                '}';
    }
}

class AccountSAXHandler extends DefaultHandler {
    private List<Account> accounts;
    private Account it;

    private boolean isName = false;
    private boolean isSurname = false;
    private boolean isAge = false;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if("accounts".equals(qName) && accounts == null) {
            accounts = new ArrayList<>();
        } else if("account".equals(qName)) {
            it = new Account();
        } else if("name".equals(qName)) {
            isName = true;
        } else if("surname".equals(qName)) {
            isSurname = true;
        } else if("age".equals(qName)) {
            isAge = true;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if("account".equals(qName)) {
            accounts.add(it);
        } else if ("name".equals(qName)) {
            isName = false;
        } else if ("surname".equals(qName)) {
            isSurname = false;
        } else if ("age".equals(qName)) {
            isAge = false;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if(isName) {
            it.setName(new String(ch, start, length));
        } else if (isAge) {
            it.setAge(Integer.parseInt(new String(ch, start, length)));
        } else if (isSurname) {
            it.setSurname(new String(ch,start,length));
        }
    }

    public List<Account> getAccounts() {
        return accounts;
    }
}

public class Runner {
    public static void main(String[] args) {
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        try {
            SAXParser saxParser = saxParserFactory.newSAXParser();
            AccountSAXHandler accountSAXHandler = new AccountSAXHandler();
            saxParser.parse(new File("accounts.xml"), accountSAXHandler);
            List<Account> accounts = accountSAXHandler.getAccounts();
            System.out.println(accounts);
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

dodanie znacznika <code class="xml"> - @furious programming

0

@ karolinaa
Dziękuję za przykład. Na razie korzystam z DOM

@ krwawy krawiec
Jak konkretnie zaimplementować Twoje rozwiązanie w moim przykładzie?

0

Czy to właściwe rozwiązanie?

 

public class Glowna {

		private static String imie;
		private static String nazwisko;
		private static int wiek;
		
	
	public static void main(String args[]){

		
		Procedury proceduryObiekt = new Procedury();
		proceduryObiekt.nadajWartosci();
		
		imie = Osoba.imie;
		nazwisko = Osoba.nazwisko;
		wiek = Osoba.wiek;
					                 
		System.out.println(imie);
		System.out.println(nazwisko);
		System.out.println(wiek);
		
	}
	}

public class Procedury {
	
		public void nadajWartosci(){
		
		Osoba.imie = "Jan";
		Osoba.nazwisko = "Nowak";
		Osoba.wiek = 20;
		
			
	}

}
public class Osoba {

		public static String imie;
		public static String nazwisko;
		public static int wiek;
		
		public Osoba(){
							
		}
		}
1

Nie, pytałeś o metody zwracające kilka wartości, napisałeś kod, w którym nie ma żadnego zwracania wartości.

public class Glowna{
    public static void main(String args[]){ 
        Osoba osoba = tworzOsoba(); 
        
        System.out.println(osoba.imie);
        System.out.println(osoba.nazwisko);
        System.out.println(osoba.wiek);
 
    }
    private static Osoba tworzOsoba(){ //metoda zwracająca kilka wartości opakowanych w obiekt
        Osoba osoba = new Osoba();
        osoba.imie = "Jan";
        osoba.nazwisko = "Nowak";
        osoba.wiek = 20;
        return osoba;
    }
}

class Osoba{
    public String imie;
    public String nazwisko;
    public int wiek;
    public Osoba(){
 
    }
}
0

Dziękuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1