2013-07-25 130 views
1

我目前正在學習使用Java進行開發,並有興趣創建其他用戶可以導入到其程序並使用的Java類。是的,我知道我的示例類簡單而愚蠢,但我想學習這個概念並開始製作更復雜的類,以便人們可以將其導入到他們的項目中。將類導入Java文件

我創建了一個簡單的「Logger」類,它在調用時將文本記錄到控制檯和文本文件以提高可讀性。您可以使用下面的命令調用這個類...

Logger Logger = new Logger(); 
Logger.create(); 
Logger.log("This text will be logged to the console and log.log"); 

記錄儀類見下文。

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

public class Logger { 
     FileWriter fw; 
     BufferedWriter br; 
     File file = new File("log.log"); 
     boolean fileExists = file.exists(); 
     public void log(String message) { 
      try { 
       fw = new FileWriter(file, true); 
       br = new BufferedWriter(fw); 
       Calendar cal = Calendar.getInstance(); 

       int hour = cal.get(Calendar.HOUR_OF_DAY); 
       if(hour > 12) 
        hour = hour - 12; 

       int minute = cal.get(Calendar.MINUTE); 
       int second = cal.get(Calendar.SECOND); 
       int millis = cal.get(Calendar.MILLISECOND); 

       int ampm = cal.get(Calendar.AM_PM); 
       String ampmString; 
       if(ampm == 1) 
        ampmString = "PM"; 
       else 
        ampmString = "AM"; 

       String now = String.format("%02d:%02d:%02d.%03d %s", hour, minute, second, millis, ampmString); 

       System.out.println(now + " - " + message); 
       br.write(now + " - " + message); 

       br.newLine(); 
       br.close(); 
      } catch (Exception err) { 
       System.out.println("Error"); 
      } 

     } 
     public void create() { 
      try { 
       fw = new FileWriter(file, true); 
       br = new BufferedWriter(fw); 
       SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-YYYY"); 
       String dateString = sdf.format(new Date()); 
       if(file.length() != 0) 
        br.newLine(); 
       System.out.println("Log: " + file.getAbsolutePath()); 
       br.write("--------------------" + dateString + "--------------------"); 
       br.newLine(); 
       br.close(); 
      } catch (Exception err) { 
       System.out.println("Error"); 
      } 
     } 
    } 

我遇到的問題是爲了使用這個類,我必須將它添加到我創建的每個項目中,並且要使用它。有沒有辦法添加像mydomain.Logger.*;這樣的導入,並且能夠訪問此類及其包含的方法?

我的問題,什麼是允許任何人以最簡單的方式導入/使用我的Logger類的最佳方式?我需要採取哪些措施來讓他們這樣做?

+1

既然你是新的Java的,我想指出,有幾個是你在這裏所概述什麼標準日誌庫。你正在編寫學習代碼,這很好,但要小心重新發明輪子。如果您使用log4j或slf4j,那麼可以讓任何其他第三方庫在您的代碼中寫入錯誤日誌文件的可能性非常高。 – jalynn2

+0

@ jalynn2我明白這一點。我只是搞亂了這個想法,這是我能想到的最簡單的事情。感謝您的建議。 :) – Dev

回答

1

將您的類編譯爲JAR文件,然後將該jar添加到每個項目的類路徑中。這是重用類的標準Java方法。

+0

有沒有辦法,我可以做這樣的事情? 'import org.apache.commons.lang.StringEscapeUtils;'但是使用我的域名,比如'import com.mydomain.Logger;'? – Dev

+1

是的,你可以'導入com.mydomain.Logger;'並且編譯器會在jar文件中找到它。如果您使用Eclipse之類的IDE,請將該jar文件添加到項目依賴項中。 – jalynn2

+0

明白了。謝謝jalynn2。 – Dev

0

您將不得不創建一個jar文件,然後人們可以將其導入到他們的項目中。

0

Scala語言允許您導入任意對象的成員,但Java只會讓您導入靜態成員。您可以嘗試使用static imports。但是,您需要將Logger類更改爲具有靜態log方法。因爲你很可能只是希望你的記錄器的一個實例,我建議使用singleton enum pattern

// Using "enum" instead of "class" 
public enum Logger { 
    // Create singleton instance 
    INSTANCE; 

    // Create static log method for export 
    public static void log(String message) { 
     INSTANCE.log(message); 
    } 

    // The rest of your class is unchanged 
    FileWriter fw; 
    BufferedWriter br; 
    File file = new File("log.log"); 
    boolean fileExists = file.exists(); 
    public void log(String message) { 
     // ... 
    } 
    public void create() { 
     // ... 
    } 
} 

現在,在每個文件要使用它,你可以做import static mydomain.Logger.log;去的log方法直接獲得!

1

每個班級都有一個package。你聲明它在你的文件的頂部。對於你的班級,這可能是package com.mydomain;。 (你的例子沒有聲明一個包,所以default被分配 - 認爲「無」)。包對應於實際的文件夾例如您應該將Logger.java放置在文件系統的路徑com/mydomain/中,以匹配上面的包聲明。

現在,如果你在同一個包中創建一個類,你可以使用Logger類,只需在你的例子中聲明一個變量即可。沒有必要的進口。

如果您在不同的包創建新類即com.otherdomain(這意味着它實際上是在文件系統中的不同的文件夾),那麼你將不得不使用這樣一個import語句:import com.mydomain.Logger;import com.mydomain.*;否則編譯器會顯示錯誤,並且不會讓您使用Logger類。

如果您希望讓其他人使用您的課程,您可能會提供您的二進制版本(即編譯的Logger.class)而不是源代碼。你可能會把這個文件放在jar(這是一個壓縮的文件結構或多或少)。

如果我想使用你的類,我只需將該jar添加到我的項目的classapth,以便編譯器和運行時系統知道在尋找類時搜索此文件。然後,我可以在我的課堂上自己寫一條import聲明,我可以使用您的記錄器。

我希望這將清除的東西了