Я пытаюсь получить File из enum в Java, например, всякий раз, когда я набираю DBIO.DBFOLDER, он должен переводиться в указанный мной файл. Есть ли способ сделать это?
package test.Test;
import java.io.File;
public enum DBIO{
DBFOLDER(),DBFILE();
public File DBFOLDER(){
return new File("project/DBFolder");
}
public File DBFILE(){
return new File(DBFOLDER()+"/DBFile");
}
}
Код выше не работает; Я просто сделал это, чтобы показать, что я хочу, чтобы он делал.




Я не уверен, что буду использовать enum для этого варианта использования, но вам нужно связать значение с каждым случаем enum, например...
public enum DBIO {
DBFOLDER(new File("project/DBFolder")), DBFILE(new File(DBIO.DBFOLDER.getPath(), "DBFile"));
private File file;
private DBIO(File file) {
this.file = file;
}
public File getPath() {
return file;
}
}
Итак, если бы вы сделали что-то вроде...
System.out.println(DBIO.DBFOLDER.getPath());
System.out.println(DBIO.DBFILE.getPath());
Печатал бы...
project/DBFolder
project/DBFolder/DBFile
Это возможно, потому что enum — это полноценный объект, а не какое-то именованное целое число.
@MCEmperor, и это часть того, почему перечисления настолько эффективны в Java по сравнению с другими языками, отличными от JVM. Возможность перечисления набора значений — это только основные возможности, которые могут выполнять перечисления Java. Присоединение полей и методов к объекту перечисления позволяет со временем сделать его более полезным.
вы можете использовать метод valueOf(), чтобы получить значение Enum, соответствующее данной строке. Если вы хотите получить файл, связанный с Enum, вам нужно будет сохранить файл как поле в классе Enum и предоставить метод получения для доступа к нему.
Вот пример класса Enum, который хранит файл и предоставляет метод получения для доступа к нему:
public enum FileEnum {
FILE_1("file1.txt", new File("file1.txt")),
FILE_2("file2.txt", new File("file2.txt"));
private final String name;
private final File file;
FileEnum(String name, File file) {
this.name = name;
this.file = file;
}
public File getFile() {
return file;
}
}
Затем вы можете использовать метод getter для доступа к файлу, связанному с Enum, например
File file = FileEnum.FILE_1.getFile();
Вы можете сделать что-то вроде этого:
import java.io.File;
interface Get< T > {
T get();
}
enum DBio {
DBFOLDER( new Get< File >() {
public File get() {
return new File( "project/DBFolder" );
}
} ),
DBFILE( new Get< File >() {
public File get() {
return new File( DBio.DBFOLDER.get() + "/DBFile" );
}
} );
private Get< File > fileLoader;
DBio( Get< File > fileLoader ) {
this.fileLoader = fileLoader;
}
public File get() {
return this.fileLoader.get();
}
public File DBFOLDER() {
return new File( "project/DBFolder" );
}
public File DBFILE() {
return new File( DBFOLDER() + "/DBFile" );
}
}
Мы используем анонимный класс интерфейса Get для загрузки файла только по запросу.
Если мы перейдем напрямую, файл будет загружен один раз и сохранен в памяти, всегда разделяя ссылку.
Вы можете заменить анонимный класс лямбдой:
// ... rest of code equals
DBFOLDER(() -> new File( "project/DBFolder" )),
DBFILE(() -> new File( DBio.DBFOLDER.get() + "/DBFile" ))
// ... rest of code equals
загружать файл только по запросу. - Объект File представляет собой легкую оболочку. Он содержит... строку. Вот и все. Это не дескриптор файла. Этот ажиотаж с интерфейсом Get<T> — бессмысленная чрезмерная инженерия. => это не то, как вы пишете лямбда-выражения в java.
Спасибо за информацию о классе File и моей путанице в синтаксисе лямбда-функции. В итоге я перепутал синтаксис со стрелочной функцией JS/TS.
Я не уверен, что буду использовать
enumдля этого варианта использования.