1

我目前正在学习使用 Java 进行开发,并且对创建其他用户可以导入到他们的程序中并使用的 Java 类感兴趣。是的,我知道我的示例类既简单又愚蠢,但我想学习这个概念并开始制作更复杂的类,人们可以将它们导入到他们的项目中。

我创建了一个简单的“ Logger ”类,当调用它时将文本记录到控制台和文本文件以提高可读性。您可以使用以下命令调用此类...

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

有关Logger类,请参见下文。

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 类的最佳方法是什么?我需要采取哪些步骤才能让他们这样做?

4

4 回答 4

2

将您的类编译成一个 JAR 文件,然后将该 jar 添加到每个项目的类路径中。这是重用类的标准 Java 方法。

于 2013-07-25T16:56:32.027 回答
1

每个班级都有一个package. 您在文件顶部声明它。对于您的班级,这可能是 ie package com.mydomain;。(您的示例未声明包,因此default已分配 - 认为“无”)。包对应于实际文件夹,例如,您应该将您的文件放在文件系统Logger.java中的路径com/mydomain/中,以匹配上面的包声明。

现在,如果您在同一个包中创建一个类,您可以Logger通过像您的示例中那样声明一个变量来使用您的类。无需进口。

如果您在不同的包中创建新类,即com.otherdomain(这意味着它实际上将位于文件系统中的不同文件夹中),那么您将不得不使用这样的导入语句:import com.mydomain.Logger;否则import com.mydomain.*;编译器将显示错误并且不会不让你使用你的Logger类。

如果你想让其他人使用你的类,你可能会发布你的二进制版本(即编译的Logger.class)而不是源代码。你可能会将该文件放在一个jar(这或多或少是一个压缩文件结构)中。

如果那时我想使用你的类,我可以将该 jar 添加到classapth我的项目中,这样编译器和运行时系统就会知道在查找类时搜索这个文件。然后我可以在课堂上自己写一个import声明,我可以使用你的记录器。

我希望这可以解决问题

于 2013-07-25T17:55:29.713 回答
0

您必须创建一个 jar 文件,然后人们可以将其导入到他们的项目中。

于 2013-07-25T16:56:15.310 回答
0

Scala 语言允许您导入任意对象的成员,但 Java 只允许您导入静态成员。您可以尝试使用静态导入。但是,您需要将 Logger 类更改为具有静态log方法。由于您可能只想要一个记录器实例,我建议使用单例枚举模式

// 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方法!

于 2013-07-25T16:56:59.000 回答