[英]Do classes you import in java have to be saved already in separate files?
[英]Import Classes Into Java Files
我目前正在学习用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.*;
这样的导入mydomain.Logger.*;
并能够访问此类及其包含的方法?
我的问题, 允许任何人以最简单的方式导入/使用我的Logger类的最佳方法是什么? 我需要采取哪些步骤才能让他们这样做?
将您的类编译为JAR文件,然后将该jar添加到每个项目的类路径中。 这是重用类的标准Java方法。
每个班级都有一个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
语句,然后我可以使用你的记录器。
我希望这可以解决问题
您将不得不创建一个jar文件,然后人们可以将其导入到他们的项目中。
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
方法!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.