Java получить файл из класса enum

Я пытаюсь получить 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 для этого варианта использования.

MadProgrammer 18.01.2023 21:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я не уверен, что буду использовать 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 — это полноценный объект, а не какое-то именованное целое число.

MC Emperor 18.01.2023 22:21

@MCEmperor, и это часть того, почему перечисления настолько эффективны в Java по сравнению с другими языками, отличными от JVM. Возможность перечисления набора значений — это только основные возможности, которые могут выполнять перечисления Java. Присоединение полей и методов к объекту перечисления позволяет со временем сделать его более полезным.

davidalayachew 19.01.2023 02:06

вы можете использовать метод 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.

rzwitserloot 18.01.2023 23:43

Спасибо за информацию о классе File и моей путанице в синтаксисе лямбда-функции. В итоге я перепутал синтаксис со стрелочной функцией JS/TS.

Cassio Fiuza 19.01.2023 13:50

Другие вопросы по теме