Gå til innhold

Abstraktere bort "stygg" repeterende kode.


Anbefalte innlegg

Hai. Leter etter en mer elegant måte og gjøre dette på. Sånn det er nå fungerer det helt fint, men jeg synes det ser litt stygt ut. Er usikker på om det i det hele tatt er noen penere måte å gjøre det på, men kan jo være... Eneste "kravet" er at det må være en del av SE 6 (og se penere ut..).

 

Har en del sånne her deklarasjoner, og alle er på samme form.

final private Action etFintNavn = new Action() {
void run(String [] args) {
	//kode
}
};

 

Det optimale hadde jo vært vært en lispmarko, men er egentlig på utkikk etter hva som helst.

Klikk for å se/fjerne innholdet nedenfor
(defmacro make-action (name &body body)
`(final private Action ,name = new Action() {
	  void run(String [] args) {
		  ,@body
	  }
   };))

 

- Peter

Lenke til kommentar
Videoannonse
Annonse

Dette finnes ikke i Java, men hvis du sier i hvilken sammenheng dette henger sammen med så kanskje vi kan gi deg et annet fornuftig svar. :)

 

Hvis det er eventlisteners det er snakk om så kan du jo lage en listenersubklasse og så sjekke kilden til eventet. Da får du mer struktur på det, i stedet for å lage en anonym listener for hvert event.

 

defListener = new DefaultListener();
JButton knapp = new JButton("Trykk meg");
knapp.addActionListener(defListener);
...
class DefaultListener extends ActionListener
{
  public void actionPerformed(ActionEvent e)
  {
  Object source = e.getSource();
  if (source == knapp)
	 // TODO
  }
}

Lenke til kommentar

Jeg holder på med en oppgave hvor vi skal lage et kommandolinje-styrt program.

 

Jeg har en HashMap<String, Action>, så når brukeren skriver inn en linje så splittes den. Første element i listen brukes til å slå opp i HashMapet etter action-objektet, mens de resterende elementene er argumentene.

 

Kort eksempel:

linjen "ls *" splittes til {"ls", "*"}.

Action a = actions.get("ls");

a.run({"*"});

 

Jeg har derfor et Action-objekt for hver av kommandoene i programmet.

Endret av Blackslash
Lenke til kommentar

Java har javax.swing.Action (relatert til GUI), men det kan ikke være den klassen det er snakk om.

 

 

Med den tilgjengelige informasjonen ser det ut som om det kunne være hensiktsmessig å bruke en kontrakt (Interface) som definerer run. Info:

http://java.sun.com/docs/books/tutorial/ja.../interface.html

http://java.sun.com/docs/books/tutorial/ja...einterface.html

 

I noen tilfeller kunne man tenke seg å bruke en abstrakt klasse med en abstrakt metode run. Info:

http://java.sun.com/docs/books/tutorial/ja...I/abstract.html

 

Siste link har også litt om forskjellene mellom disse fremgangsmåtene.

 

En evt. gevinst kan dog være vanskelig å få øye på, særlig når du allerede har noe som funker.

 

 

Forøvrig har man design patterns - et av dem er Command Pattern. Men det blir muligens overkill.

Lenke til kommentar

Du har rett i at det ikke er javax.swing.Action. Har ikke drevet med GUI-programmering, så har ikke vært borti noe av det. Sånn som det er nå, så er Action-klassen min abstrakt.

 

Har hørt om Command Pattern, men aldri sett på det. Ser ut som det er litt overkill, og jeg er jo egentlig bare ute etter noe kosmetisk. Men takk for svar. :)

 

liten digresjon:

Klikk for å se/fjerne innholdet nedenfor

Har vist en tendens til å finne opp java-ting på nytt, for noen uker siden lagde jeg interfacet

interface CompareAble<E> {
int compareTo(E e);
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...