Gå til innhold

Abstraktere bort "stygg" repeterende kode.


Anbefalte innlegg

Skrevet

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

Videoannonse
Annonse
Skrevet

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
  }
}

Skrevet (endret)

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
Skrevet

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.

Skrevet

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);
}

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...