Zwracanie tablicy metod.

0

Potrzebuje zrobic klase dzieki ktorej bede mogl zwracac metody i umiescic je jako wartosci hashmapy dla czterech kluczy + - * /

import java.math.BigDecimal;
import java.lang.reflect.Method;

public class Operacje {
	Operacje metody = new Operacje();
	Class c = metody.getClass();
	
	public String add(BigDecimal a, BigDecimal b) {
		a.add(b);
		return a.toString();
	}

	public String divide(BigDecimal a, BigDecimal b) {
		a.divide(b);
		return a.toString();
	}
	
	public String multiply(BigDecimal a, BigDecimal b) {
		a.multiply(b);
		return a.toString();
	}

	public String substract(BigDecimal a, BigDecimal b) {
		a.subtract(b);
		return a.toString();
	}
	
	public Method[] getMethod(){
		//potrzebuje zwrocic tablice tych metod
	}
	
}
1

Nie rób tego w ten sposób...
Zrób sobie mapę Map<String,BiFunction<BigDecimal, BigDecimal, String>> i wrzuć do niej method reference do tych twoich metod.

0

Dość dziwne są te metody, powinny wyglądać tak:

    public BigDecimal add(BigDecimal a, BigDecimal b) {
        return a.add(b);
    }

Unikniesz wielokrotnej konwersji liczby na String i z powrotem (np. w banalnym dodawaniu a+b+c+d). Na String skonwertujesz dopiero wtedy, kiedy będzie to konieczne.

0

Za zielony jestem by to zrozumie jak mam "wrzucic method reference"
Pokaze dokladnie jaki mam problem

class Calc
{
    private HashMap<String,Method> methods = new HashMap<String,Method>();

    public Calc()
    {
    	//W konstruktorze musze stworzyc klucze i wartosci hashmapy
                         (znak,metoda do wykonania (na dole)
    }
            public String doCalc(String arg){

               //ta metoda bedzie musiala mi zwrocic wynik(dokonczeniem tej klasy i wyjatkami zajme sie po uzyskaniu mapy)
                String[] items = arg.split("\\s+");
                BigDecimal arg1 = null;
                BigDecimal arg2 = null;
                Method method = null;
                String result = null;
                 
                arg1 = new BigDecimal(items[0]);
                arg2 = new BigDecimal(items[2]);
                method = methods.get(items[1]);
                result = (String) method.invoke(arg1,arg2);
                return result;

    //tu mam metody do zwracania(dostalem wskazowki ze mozna te metody dac do interfaceu tylko nie wiem jak implementacja tych o to metod by sie nam tu przydala:( )
	public String add(BigDecimal a, BigDecimal b) {
		a.add(b);
		return a.toString();
	}

	public String divide(BigDecimal a, BigDecimal b) {
		a.divide(b);
		return a.toString();
	}
	
	public String multiply(BigDecimal a, BigDecimal b) {
		a.multiply(b);
		return a.toString();
	}

	public String substract(BigDecimal a, BigDecimal b) {
		a.subtract(b);
		return a.toString();
	}
}

A i nie moge uzywac zadnych instrukcji sterujacych (if for)

0

Np. tak

    private HashMap<String,Method> methods = new HashMap<String,Method>();
    private MathContext mc = new MathContext(7);
    try
    {
          Class klasa = Class.forName("java.math.BigDecimal");
          Method method = klasa.getMethod("add",BigDecimal.class);
          methods.put("+",method);
          method = klasa.getMethod("subtract",BigDecimal.class);
          methods.put("-",method);
          method = klasa.getMethod("multiply",BigDecimal.class);
          methods.put("*",method);
          method = klasa.getMethod("divide",BigDecimal.class,MathContext.class);
          methods.put("/",method);              
      }
      catch(ClassNotFoundException | NoSuchMethodException e)
      {
      }
   }

Żadnych własnych metod (dodających, odejmujących,..) nie musisz pisać. A potem

    public String doCalc(String arg)
    {
        BigDecimal arg1 = null;
        BigDecimal arg2 = null;
        Method method = null;
        BigDecimal result = null;
        try
        {
            arg1 = new BigDecimal(items[0]);
            arg2 = new BigDecimal(items[2]);
            method = methods.get(items[1]);
            result = (BigDecimal)method.invoke(arg1,arg2);
            return result.toString();
        }
        catch(IllegalArgumentException e)
        {
            try
            {
                result = (BigDecimal)method.invoke(arg1,arg2,mc);
                return result.toString();
            }
        ...
0

A jesli na upartego musialbym storzyc te metody. To czy jest szansa aby sie do nich dostać??

0

Zmień trochę ten wiersz:

Class klasa = Class.forName("java.math.BigDecimal");
2

Jejku, tylko nie refleksje i cuda na kiju. Mamy javę 8 a nie 1.4 ;]

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.function.BiFunction;

@FunctionalInterface
interface BigDecimalFunction extends BiFunction<BigDecimal, BigDecimal, BigDecimal> {
}

public class Calc {
    private final HashMap<String, BigDecimalFunction> methods = new HashMap<>();

    private Calc() {
        methods.put("-", BigDecimal::subtract);
        methods.put("+", BigDecimal::add);
        methods.put("*", BigDecimal::multiply);
        methods.put("/", BigDecimal::divide);
    }

    private String doCalc(String arg) {
        String[] items = arg.split("\\s+");
        BigDecimal arg1 = new BigDecimal(items[0]);
        BigDecimal arg2 = new BigDecimal(items[2]);
        BigDecimalFunction method = methods.get(items[1]);
        return method.apply(arg1, arg2).toString();
    }

    public static void main(String[] args){
        Calc c = new Calc();
        System.out.println(c.doCalc("1 + 2"));
    }
}

Jak koniecznie chcesz mieć te metody w swojej klasie to musisz potem zamienić
methods.put("-", BigDecimal::subtract);
na
methods.put("-", this::subtract);

0
bogdans napisał(a):

Zmień trochę ten wiersz:

Class klasa = Class.forName("java.math.BigDecimal");

Co masz na mysli(ciagnac reflect)
this.getClass();
i zmieniam

klasa.getMethod("x",this.getClass());

to wywala wyjatek

0

Jak mam wprowadzic ta klase do typu Class. Dlaczego nie wchodzi mi to? Wiem ze stara metoda ale musze to zrobic wlasniej jakos tak. wiem ze mecze ale dopiero to pierwsze bardziej skaplikowane kroki w javie

try
        {
            Class klasa = thisIns.getClass();
            Method method = klasa.getMethod("add",Operacje.class);
            methods.put("+",method);
            method = klasa.getMethod("subtract",Operacje.class);
            methods.put("-",method);
            method = klasa.getMethod("multiply",Operacje.class);
            methods.put("*",method);
            method = klasa.getMethod("divide",Operacje.class,MathContext.class);
            methods.put("/",method);  
            
            System.out.println(klasa.getCanonicalName()+"cos");
            Class class1 = getClass();
            System.out.println(class1.getCanonicalName()+"cos");
        }
        catch(NoSuchMethodException e)
        {
        	System.out.println("cos1");
        }

}
0
private Operacje thisIns = new Operacje();

jeszcze to dalem probowalem czegos z Class ale nic mi nie przechodzi.

0
Class klasa = Class.forName("Operacje");

albo (w konstruktorze klasy Operacje)

Class klasa = this.getClass();
0

Dobra moze jestem glabem ale mam tak:

 public Calc()
        {
            try
            {
                Class klasa = Class.forName("Operacje");
                System.out.println(klasa.getCanonicalName());
                Method method = klasa.getMethod("add",Operacje.class);
                methods.put("+",method);
                method = klasa.getMethod("subtract",Operacje.class);
                methods.put("-",method);
                method = klasa.getMethod("multiply",Operacje.class);
                methods.put("*",method);
                method = klasa.getMethod("divide",Operacje.class,MathContext.class);
                methods.put("/",method);              
            }
            catch(ClassNotFoundException | NoSuchMethodException e)
            {
            	System.out.println("nie udalo sie zaladowac metod");
            }
        }

No i ciagle wywala mi wyjatek klasa Operacje wyglada tak

package Zad2;

import java.math.BigDecimal;
import java.math.MathContext;

public class Operacje {
	MathContext mc = new MathContext(7);
	
	public String add(BigDecimal a, BigDecimal b) {
		a.add(b);
		return a.toString();
	}

	public String divide(BigDecimal a, BigDecimal b) {
		a.divide(b);
		return a.toString();
	}
	
	public String multiply(BigDecimal a, BigDecimal b) {
		a.multiply(b);
		return a.toString();
	}

	public String substract(BigDecimal a, BigDecimal b, MathContext mc) {
		a.subtract(b,mc);
		return a.toString();
	}
	
}

co jest nie tak:( caly dzien siedze i nie moge ruszyc sie do przodu...

0

i nie zwraca mi nazwy tej klasy, w przypadku klasy bigDecimals zwrocilo mi java.math.bigDecimal... co jest

0

Używasz pakietu, zatem w Twoim programie nie ma klasy Operacje, jest klasa Zad2.Operacje.

0

Teraz zwraca mi getCanonicalName Zad2.Operacje ale nada nie zapisuje mi do Method method wywala "nie udalo sie zaladowac metod".

Zmienilem

getMethod("add", Zad2.Operacje.class);
0

Ok teraz wiem Parametry to argumenty metod:D

Teraz wywala mnie przy invoke.

0

Udalo sie :D dzieki wielkie za pomoc. Wystarczylo troche jeszcze dopisac :D

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