Avatar billede kroning Nybegynder
02. august 2011 - 20:39 Der er 10 kommentarer og
1 løsning

Lokal funktion

I pascal kan man definere en lokal funktion inde i en anden funktion f.eks.

function noget : integer;

function en_lokal : byte;
begin
end;

begin //start på noget
en_lokal kan kun kaldes herfra.
end;

Hvordan laver man noget lignende i java, jeg har en funktion hvor 3 linier bliver gentaget en del gange og dem vil jeg så flytte ind i en funktion så jeg blot kan kalde den hver gang i stedet.

Bruger Eclipse og udvikler til Android.
Avatar billede arne_v Ekspert
02. august 2011 - 20:47 #1
Normalt tror jeg bare at man ville lave metoden udenfor og saa ignorere at scope er lidt stoerre end det burde vaere.
Avatar billede arne_v Ekspert
02. august 2011 - 20:54 #2
Java har en feature kaldet "local inner classes" som til en vis grad kan betragtes som vaerende en objekt orienteret pendent til det du soeger.

Men syntaxen er lidt tung.

Eksempel:

public class LocalFunction {
    public static void test() {
        class LF {
            public void p(int n, String s) {
                for(int i = 0; i < n; i++) {
                    System.out.println(s);
                }
            }
        }
        LF o = new LF();
        o.p(1, "One");
        o.p(2, "Two");
    }
    public static void main(String[] args) {
        test();
    }
}
Avatar billede kroning Nybegynder
02. august 2011 - 21:06 #3
Dit første svar ved jeg ikke hvad betyder :) og egentlig kan jeg heller ikke lige forstå hvordan jeg skal bruge koden i dit andet svar, er rimelig nybegynder i java og syntes det er meget rodet sammenlignet med f.eks. Delphi.
Men måske er løsningen simpel så her kommer lidt kode:

Jeg opertter en Thread i aktivitetens OnCreate:
Thread thread = new Thread(this);
thread.start();

senere uden for OnCreate kommer så trådens run metode: det er linierne:
pi_string="";
handler.sendEmptyMessage(0);
som jeg gerne vil have puttet ind i en metode som jeg kan kalde i stedet.


public void run() {
        pi_string="Opretter forbindelse";
        handler.sendEmptyMessage(0);

        prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        String ftp_host = prefs.getString(getString(R.string.prefkey_ftp_backup_host), "");
        String ftp_user = prefs.getString(getString(R.string.prefkey_ftp_backup_user), "");
        String ftp_password = prefs.getString(getString(R.string.prefkey_ftp_backup_password), "");
        String ftp_remote_path = prefs.getString(getString(R.string.prefkey_ftp_backup_remote_path), "");
       
        FTPClient ftp = new FTPClient();
        try{
            ftp.connect(ftp_host);
            pi_string="Connected to "+ftp_host;
            handler.sendEmptyMessage(0);
         
            ftp.enterLocalPassiveMode();
            if(!ftp.login(ftp_user,ftp_password)){
                ftp.logout();
            pi_string="Can't login, wrong user name or password";
            handler.sendEmptyMessage(0);

            return;
            }

            pi_string="Logged in";
            handler.sendEmptyMessage(0);
         
          if (ftp_remote_path.length()>0)
              ftp.changeWorkingDirectory(ftp_remote_path);
          ftp.setFileType(ftp.BINARY_FILE_TYPE);
           
            File root = Environment.getExternalStorageDirectory();           
            File m_CurrentDirectory = new File(root, getString(R.string.mainpath));
           
            Calendar temp=Calendar.getInstance();
            long ligenu=temp.getTimeInMillis();
           
            long senestebackup = prefs.getLong("senestebackup", 0);
           
            Editor editor = prefs.edit();
            editor.putLong("senestebackup", ligenu);
            editor.commit();
           
            pi_string="Seneste backup: "+senestebackup;
            handler.sendEmptyMessage(0);
           

            pi_string="Uploading files";
            handler.sendEmptyMessage(0);

            File[] fileList = m_CurrentDirectory.listFiles();
            if (fileList != null)
            {
            for ( int i = 0;i<fileList.length;i++)
            {
               
                if (fileList[i].lastModified()>senestebackup) {
                    File f = new File(root, getString(R.string.mainpath)+fileList[i].getName());

                    pi_string="Uploading: "+fileList[i].getName()+" - "+String.valueOf(fileList[i].lastModified());
                    handler.sendEmptyMessage(0);

                    InputStream in = new FileInputStream(f);
                    boolean Store = ftp.storeFile(fileList[i].getName(), in);
                }
               
            }
            }

          ftp.disconnect();
          pi_string="Done";
          handler.sendEmptyMessage(0);
        }
       
        catch(Exception ex){
              pi_string="Error "+ex;
              handler.sendEmptyMessage(0);
          //TODO: properly handle exception
          //Log.i(TAG,ex);
          //TODO:Alert the user this failed
        }
       
        //closeButton.setEnabled(true);           
       
    }
   
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mBodyText.append(pi_string+"\n");

        }
    };
Avatar billede arne_v Ekspert
02. august 2011 - 21:10 #4
Foerste loesning:

public void letUsEmpty() {
    pi_string="";
    handler.sendEmptyMessage(0);
}
public void run() {
    ...
    letUsEmpty();
    ...
}
Avatar billede arne_v Ekspert
02. august 2011 - 21:11 #5
Anden loesning:

public void run() {
    class LF {
        public void letUsEmpty() {
            pi_string="";
            handler.sendEmptyMessage(0);
        }
    }
    LF lf = new LF();
    ...
    lf.letUsEmpty();
    ...
}
Avatar billede arne_v Ekspert
02. august 2011 - 21:16 #6
Jeg tror ioevrigt at din kode kan pyntes lidt.

Eksempel:

            File[] fileList = m_CurrentDirectory.listFiles();
            if (fileList != null)
            {
            for ( int i = 0;i<fileList.length;i++)
            {

->

            for ( File f : m_CurrentDirectory.listFiles() )
            {
Avatar billede kroning Nybegynder
02. august 2011 - 21:38 #7
Takker meget. Jeg har brugt din første løsning som virker fint, jeg er næsten helt sikker på at jeg i går lavede en lignende metode men fik da en fejl besked i eclipse, noget med at metoden ikke kunne kaldes da den ikke tilhørte tråden, men lige meget det virker nu.
Mht. at pynte så er der nok mange steder der trænger.
Avatar billede kroning Nybegynder
03. august 2011 - 00:10 #8
Et svar?
Avatar billede arne_v Ekspert
03. august 2011 - 01:35 #9
gerne
Avatar billede arne_v Ekspert
03. august 2011 - 01:43 #10
I Delphi kan du jo ogsaa altid:

function en_lokal : byte;
begin
end;

function noget : integer;

begin //start på noget
en_lokal kan kaldes hvorsomhelst fra
end;
Avatar billede arne_v Ekspert
03. august 2011 - 01:44 #11
Java og Delphi er ret forskellige.

Udover syntaxen er mange af ideerne ogsaa lidt anderledes.
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