2013-07-25 87 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声明,我可以使用您的记录器。

我希望这将清除的东西了