Avatar billede andreas Nybegynder
04. januar 2007 - 01:05 Der er 19 kommentarer og
1 løsning

Afhængighed?

Hejsa,

Først vil jeg lige beskrive mit setup:

Der er Klasse1 som laver nye instanser af Klasse2, hver gang en klient tilkobler sig, der extender Threads, således der kan håndteres mere end 1 klient af gangen. Dette er standard trådning.

I Klasse2 vil jeg nu gerne bruge klassen Klasse3, men denne klasse skal indlæse et HashMap fra en fil på harddisken, som den skal bruge når den behandler data. Denne fil ændrer sig ikke med mindre man kalder en speciel metode.

Mit "problem" er, at hver gang en klient tilkobler sig, oprettes der en ny instans af Klasse2, som igen opretter en ny instans af Klasse3 der laver I/O idet den indlæser HashMappet.

Nu er mit spørgsmål, kan man lave således alle Klasse2 instanserne deler den "samme" instans af Klasse3 idet jeg gerne vil undgå at indlæse den flere gange, for at mindske på I/O'en til harddisken, og dermed optimere hastigheden. Kan det klares ved at lave attributten i Klasse3 der indeholder HashMap'et til static, eller hvordan?

Håber i forstår dette...
Avatar billede arne_v Ekspert
04. januar 2007 - 01:07 #1
singleton
Avatar billede arne_v Ekspert
04. januar 2007 - 01:07 #2
(static virker også men singleton er pænere)
Avatar billede andreas Nybegynder
04. januar 2007 - 01:08 #3
Hvordan virker singleton i dette tilfælge?
Avatar billede arne_v Ekspert
04. januar 2007 - 01:14 #4
hvis Klasse3 er en singleton så vil alle dine Klasse2 instanser kalde
Klasse3.getInstance() og få fat i samme instans af Klasse3
Avatar billede andreas Nybegynder
04. januar 2007 - 01:17 #5
Hm, ikke helt forstået. For Klasse1 laver en socket der lytter efter klienter. Når en klient tilkobler sig, kaldes new Klasse2()... ind i den klasse laves der end ny Klasse3 klass = new Klass3().. hvorefter metoderne der bliver tilgængelige i klass, bliver brugt.
Avatar billede arne_v Ekspert
04. januar 2007 - 01:29 #6
Klasse3 klass = new Klass3();

skal erstattes af:

Klasse3 klass = Klasse3.getInstance();
Avatar billede andreas Nybegynder
04. januar 2007 - 01:54 #7
Her er min løsning, ser det hensigtmæssigt ud:

public class Klasse3
{
  private static Klasse3 instance = new Klasse3();

  public static synchronized Klasse3 getInstance()
  {
    return instance;
  }

  private Klasse3()
  {
  }
}

public class Klasse2 extends Threads
{
  public Klasse2()
  {
    start();
  }

  public void run()
  {
    Klasse3 test = Klasse3.getInstance();
    // do something...
  }
}
Avatar billede arne_v Ekspert
04. januar 2007 - 01:56 #8
det ser umiddelbart meget fornuftigt ud
Avatar billede andreas Nybegynder
04. januar 2007 - 02:01 #9
Hvis man nu skulle udvide denne model til at være et log modul der kan lave log, hvor man angiver filnavn man vil gamme i, og en String med det tekst man vil gemme, er det så mest hensigtsmæssigt at bruge singleton her også, eller er det bedre at oprette en ny instans hele tiden?
Avatar billede arne_v Ekspert
04. januar 2007 - 02:02 #10
log kunne også laves som singleton

men lad være med at lave dit eget log modul - bruge java 1.4 logging eller hvis
det er server kode log4j
Avatar billede andreas Nybegynder
04. januar 2007 - 02:06 #11
Okay, det er ikke server kode. Jeg må lige se lidt på java 1.4 logging. Har du nogle gode links eller noget?

Tak for hjælpe, endnu gang meget konstruktivt. Og igen, hvis du vil ha point, så smid du bare et svar.
Avatar billede arne_v Ekspert
04. januar 2007 - 03:05 #12
http://www.eksperten.dk/artikler/97

introducerer meget kort java 1.4 logging og log4j

du kan læse meget mere om dem i dokumentationen
Avatar billede arne_v Ekspert
04. januar 2007 - 03:05 #13
og et svar
Avatar billede andreas Nybegynder
04. januar 2007 - 15:09 #14
Jo, jeg har læst den artikel. Jeg fik bare et mindre problem med Logger. Jeg vil gerne have den laver XML log som den gør default. Men når jeg siger den skal appende til log filen, laver den nye <xml... headere, men den skal jo bare forsætte med at recorde?
Avatar billede arne_v Ekspert
05. januar 2007 - 04:09 #15
det er ikke helt ligetil at starte med at skrive midt i en fil

man kunne dog muligvis godt fixe noget
Avatar billede andreas Nybegynder
09. januar 2007 - 23:48 #16
Det kunne være super. Skal jeg oprette et spørgsmål ang. det eller vil du måske svare på det her?
Avatar billede arne_v Ekspert
10. januar 2007 - 04:35 #17
jeg kan godt svare her

nu kommer et virkeligt grimt hack
Avatar billede arne_v Ekspert
10. januar 2007 - 04:35 #18
.level = INFO
handlers = java.util.logging.FileHandler
java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.formatter = java.util.logging.XmlFormatter
java.util.logging.FileHandler.pattern = C:\log.log
java.util.logging.FileHandler.append = true
Avatar billede arne_v Ekspert
10. januar 2007 - 04:35 #19
package january;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.XMLFormatter;

public class AppendToLog {
    public static void main(String[] args) throws Exception {
        Logger logger = Logger.getLogger("Test");
        logger.addHandler(new HackFileHandler("C:\\hacklog.log", Level.FINE));
        logger.info("This is a test");
    }
}

class HackFileHandler extends FileHandler {
    public HackFileHandler() throws IOException, SecurityException {
        this("NUL:", Level.INFO);
    }
    public HackFileHandler(String fnm, Level lvl) throws IOException, SecurityException {
        super(fnm, true);
        setLevel(lvl);
        // start hack
        long len = (new File(fnm)).length();
        if(len > 7) {
            super.close();
            RandomAccessFile raf = new RandomAccessFile(fnm, "rw");
            raf.setLength(len - 7);
            raf.close();
            setFormatter(new HackFormatter());
            setOutputStream(new FileOutputStream(fnm, true));
        }
        // slut hack
    }
}

class HackFormatter extends XMLFormatter {
    public String getHead(Handler h) {
        return "";
    }
}
Avatar billede arne_v Ekspert
10. januar 2007 - 04:37 #20
log.log
=======

<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2007-01-09T22:34:55</date>
  <millis>1168400095000</millis>
  <sequence>0</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>january.AppendToLog</class>
  <method>main</method>
  <thread>10</thread>
  <message>This is a test</message>
</record>
</log>
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2007-01-09T22:34:56</date>
  <millis>1168400096609</millis>
  <sequence>0</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>january.AppendToLog</class>
  <method>main</method>
  <thread>10</thread>
  <message>This is a test</message>
</record>
</log>
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2007-01-09T22:34:57</date>
  <millis>1168400097984</millis>
  <sequence>0</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>january.AppendToLog</class>
  <method>main</method>
  <thread>10</thread>
  <message>This is a test</message>
</record>
</log>
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2007-01-09T22:34:58</date>
  <millis>1168400098828</millis>
  <sequence>0</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>january.AppendToLog</class>
  <method>main</method>
  <thread>10</thread>
  <message>This is a test</message>
</record>
</log>

hacklog.log
===========

<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2007-01-09T22:34:55</date>
  <millis>1168400095000</millis>
  <sequence>0</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>january.AppendToLog</class>
  <method>main</method>
  <thread>10</thread>
  <message>This is a test</message>
</record>
<record>
  <date>2007-01-09T22:34:56</date>
  <millis>1168400096609</millis>
  <sequence>0</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>january.AppendToLog</class>
  <method>main</method>
  <thread>10</thread>
  <message>This is a test</message>
</record>
<record>
  <date>2007-01-09T22:34:57</date>
  <millis>1168400097984</millis>
  <sequence>0</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>january.AppendToLog</class>
  <method>main</method>
  <thread>10</thread>
  <message>This is a test</message>
</record>
<record>
  <date>2007-01-09T22:34:58</date>
  <millis>1168400098828</millis>
  <sequence>0</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>january.AppendToLog</class>
  <method>main</method>
  <thread>10</thread>
  <message>This is a test</message>
</record>
</log>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester