1

プログラムがデフォルト値としてアクセスできる静的 (最終) 値を提供する最良の方法は何ですか? 最も効率的またはベストプラクティスは何ですか? AWT/Swing で普通の古い Java を使用しています。

たとえば、アクセス可能なパブリック定数のみを含むクラスを作成することを想像できDefaultます。それを「ハードコード」と呼びますか?

もう 1 つのアイデアは、Android のようにリソース ファイルで値を提供することです。しかし、コンパイル時にファイルを解析し、そのファイルのクラスを生成するメカニズムが必要になります。このようなものは、Android SDK を使用しない Java に存在しますか?

ベスト プラクティスとデザイン パターンに興味があります。私の質問に対する推奨事項は大歓迎です。

4

2 に答える 2

1

たとえば、アクセス可能なパブリック定数のみを含むクラスを作成することを想像できDefaultます。それを「ハードコーディング」と呼びますか?

絶対に、これはハードコーディングになります。一方、すべてのラストチャンス デフォルトは必然的にハードコードされているため、これはまったく問題になりません。

また、使用する可能性のあるさまざまな変数のデフォルトをハードコードしたマップを作成し、デフォルトが必要なときにそのマップから読み取ることもできます。ただし、これにより、コンパイラは、参照するすべての定数が存在することを保証できません。これが、最初にデフォルトのクラスを作成するポイントだったと思います。

私はクラスのあなたの提案に行き、Default素敵で読みやすい解決策のためにそれの静的インポートを使用します.

于 2013-10-06T13:18:44.513 に答える
1

通常、定数は関連するクラスに属します。例えば:

public class Service {
    public static final int PORT = 8080;

    public static final int TIMEOUT = 10_000;

    public Service() {
        // ...
    }
}

public class AppWindow {
    public static final boolean CENTER_WINDOW = false;

    public static final int VISIBLE_LINES = 12;

    public AppWindow() {
        // ...
    }
}

定数を構成可能にしたい場合、最も簡単な方法は、システム プロパティとして定義可能にすることです。

public class Service {
    public static final int PORT = Math.max(1,
        Integer.getInteger("Service.port", 8080));

    public static final int TIMEOUT = Math.max(1,
        Integer.getInteger("Service.timeout", 10_000));
}

public class AppWindow {
    public static final boolean CENTER_WINDOW =
        Boolean.getBoolean("AppWindow.centerWindow");

    public static final int VISIBLE_LINES = Math.max(1,
        Integer.getInteger("AppWindow.visibleLines", 12));
}

ユーザーがファイルでこれらのデフォルトを構成できるようにしたい場合は、定数を含むクラスのいずれかがロードされる前に行われている限り、プロパティ ファイルからそれらを読み取ることができます。

Path userConfigFile =
    Paths.get(System.getProperty("user.home"), "MyApp.properties");

if (Files.isReadable(userConfigFile)) {
    Properties userConfig = new Properties();
    try (InputStream stream =
            new BufferedInputStream(Files.newInputStream(userConfigFile))) {
        userConfig.load(stream);
    }

    Properties systemProperties = System.getProperties();
    systemProperties.putAll(userConfig);
    System.setProperties(systemProperties);
}

(簡潔にするために、プロパティ ファイルの場所を意図的に単純化しすぎています。各 OS には、そのようなファイルの場所に関する異なるポリシーがあります。)

于 2013-10-06T14:08:03.337 に答える