[英]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.