Abstracte Klasse + Konstructor ...?

takidoso

Erfahrenes Mitglied
Halli und Hallo,
irgendwie zweifele ich gerade an mir selbst bzw an meinem bisherigen Verständnis.

Ich habe eine Abstrakte Klasse mit einem parameterlosen Konstructor.
In diesem Konstructor wird ein privates Memberobject (File) initialisiert um später in in einer Methode verwendet zu werden.
Ich stelle nun verduzt fest, dass dieses Member offenbar nicht initialisert wird (null beim Aufruf ist) :confused:
Ich weiß nicht ob es damit zusammenhängt, aber die eigentlich verwendete Sub-Klasse wird dynamisch mittels Class.forName(className).newInstance() instanziiert.

Interface, welches zu einem simplen PlugIn-Mechanismus verwendet wird
Java:
public interface RunnableByProperties extends Runnable
{
    void init(Properties props) throws Exception;
}

Abstrakte Klasse
Java:
public abstract class CommandingAppl implements RunnableByProperties
{
	final static public String PN_FEEDBACK_OUTPUT_DIR    = "feedback.output.dir";
	
	private   File    m_commandDir;
	protected File    m_feedbackOutputDir;
	
	public void CommandingApple()
	{
		m_commandDir         = new File(SingletonManager.getDataHolder().getCommandDirPath());
		FileUtils.ensureDirectory(m_commandDir, true, true, true);
	}
	
	
	
	protected void putFeedbackFile(String fileName, String content) throws IOException
	{
		File feedBackFile = new File(m_feedbackOutputDir, fileName);
		feedBackFile.createNewFile();
		PrintWriter writer = new PrintWriter(feedBackFile);
		writer.write(content);
		writer.flush();
		writer.close();
	}
	
	protected void putFDCommand(String command) throws IOException, InterruptedException
	{
		File commandFile = new File(m_commandDir,command);
		commandFile.createNewFile();
		
		int      t = 10;
		String[] dirContent;
		while((dirContent = m_commandDir.list(new RegexFileNameFilter(command, ""))).length>0 && t>0)
		{
			Thread.sleep(1000);
			t--;
		}
		
		if (dirContent.length>0)
		{
			StringBuffer dirStrBuff = new StringBuffer(100);
			for (String fName : dirContent)
			{
				dirStrBuff.append(fName).append("\n");
			}
			throw new RuntimeException("Time out for '"+command+"' still found:"+dirStrBuff+" in '"+m_commandDir.getAbsolutePath()+"'");
		}
	}
}

Abgeleitete Klasse:
Java:
public class CertiInstaller extends CommandingAppl
{
    ...
      public CertiInstaller()
      {
            super();
      }

     public void init(Properties props) throws Exception
     {
          .....
     }
     public void run()
     {
         .....
     }
     
     protected void install() throws Exception 
     {
         putFDCommand("all.stop");      // geht schief weil m_commandDir trotz Initialisierung im Konstruktor null ist
         ......
     }
   ....

Im Debugging ist festzustellen, dass der parameterlose Konstructor angehopst wird jedoch in der abstrakten Klasse offenbar nicht :eek:
Hat da jemand eine Erklärung dafür?
Wenn ich die Membervariable in der abstracten Klasse gleich initialisiere klappt es.
Wo steht eigentlich geschrieben, dass Konstruktoren von Abstrakten Klassen ignoriert werden?:confused:

mit fragenden Grüßen

Takidoso
 
Zuletzt bearbeitet:
Wer ruft denn install auf?

Wenn du dir nicht sicher bist ob der Debugger vielleicht Unsinn macht, baue doch zur Sicherheit nochmal Konsolenausgaben ein.
 
Hi Zeja,
install() wird, hier einfach mal nicht dargetellt, durch die run()-Routine aufgerufen.
Das ist aber IMHO nebensächlich. Ich hatte tatsächlich System.outs. produziert:
einen hinter dem super()-Aufruf im CertiInstaller und einem im Konstruktor vom CommandingAppl. Herauskommt, dass der Konstruktor von CertiInstaller tatsächlich aufgerufen wird aber komischerweise nicht der von CommandingAppl trotz des super(); :suspekt:
Das ist vermutlich was für Java-Rätsel.
 
Hahaha ich bin wohl heute mit Blindheit geschlagen :D

Habe natürlich den Konstruktor offenbar im Dämmerzustand verharrend falsch geschrieben und daraus eine normal Methode gemacht :rolleyes:

Also da habe ich nur zu blind "gewütet" sorry

also alles I.O.
 
Zurück