簡體   English   中英

如何根據 cmd 參數初始化 static 最終變量?

[英]How to initialize static final variables based on cmd args?

課程作業簡介要求我將可選的 cmd 參數分配給 static 最終變量。

我曾嘗試在 main() 中執行此操作,但編譯器抱怨“無法為最終變量賦值”。 我嘗試在 main() 調用的 static 方法中執行此操作,但同樣的錯誤。 我聽說在其他答案中使用了 static 塊,但是當我決定分配什么時,我需要能夠達到 cmd 參數。 我對參數解析也有些頭疼,因為 arguments 都應該有默認值,除非提供了一個。 非常歡迎任何獎金建議。

public class FibonacciNim {
    private static Scanner myScanner = new Scanner(System.in);
    private static final int NO_OF_HEAPS;
    private static final int TOKENS_PER_HEAP;

    public static void main(String[] args) {
        // set heaps and tokens using args
        if (args.length == 0) {
            NO_OF_HEAPS = 3;
            TOKENS_PER_HEAP = 9;
        } else {
            boolean usageCorrect = false;
            for (int i = 0; i < args.length-1; i++) {
                if (args[i].equals("-heaps")) {
                    try {
                        NO_OF_HEAPS = Integer.parseInt(args[i+1]));
                        usageCorrect = true;
                    } catch (NumberFormatException e) {
                        usageCorrect = false;
                    }
                } else if (args[i].equals("-tokens")) {
                    try {
                        TOKENS_PER_HEAP = Integer.parseInt(args[i+1]);
                        usageCorrect = true;
                    } catch (NumberFormatException e) {
                        usageCorrect = false;
                    }
                }
            }
        }

        ...

    }

    ...

}

謝謝閱讀!

你不能......實際上,真的從命令行將某些東西分配給 static 最終變量。 (你也許可以通過非常骯臟的黑客,但這可能不是任務的意圖。)

可能的情況是您應該創建一個可變的 static final 並將其分配給它的內容。 這是一種糟糕的做法,你真的不應該在現實生活中這樣做,但它至少是合理的。 例如,你可以寫

static final String[] argHolder = new String[1];
public static void main(String[] args) {
  ...
  argsHolder[0] = args[0];
  ...
}

Static 最終變量只能在初始化時賦值。

public class MyClass {

  private static final int NO_OF_HEAPS = 3;

}

非靜態最終變量可以在行中或在構造函數中賦值:

public class MyClass {

  private final int NO_OF_HEAPS;

  public MyClass() {
    NO_OF_HEAPS = 9;
  }

}

你可以; 但是,通過將 static 變量更改為可變項(例如AtomicInteger ),將它們設置為“基本上”最終

public class FibonacciNim {
  private static Scanner myScanner = new Scanner(System.in);
  private static final AtomicInteger NO_OF_HEAPS = new AtomicInteger(0);
  private static final AtomicInteger TOKENS_PER_HEAP = new AtomicInteger(0);

  public static void main(String[] args) {
    // set heaps and tokens using args
    if (args.length == 0) {
        NO_OF_HEAPS.set(3);
        TOKENS_PER_HEAP.set(3);
    }
    ...
  }
}

至於解析命令行 arguments 您可以查看JCommander http://jcommander.org/

它提供了解析命令行 arguments 並填充 POJO 以使用的功能,因此您不必自己解析它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM