Как я могу создать статический финал java.net.URL? - PullRequest
8 голосов
/ 06 декабря 2011

Мой вопрос прост.Я пытаюсь создать набор из java.net.URL, равный public static final, чтобы любой класс мог получить к ним доступ из любого контекста, так как эти URL не изменятся во время выполнения.Однако, когда я пытаюсь создать их, я получаю сообщение об ошибке компилятора, говорящее мне, что я должен перехватить или объявить брошенный java.net.MalformedURLException, но это невозможно вне метода. Есть ли способ обойти такой конструктор, который выбрасывает не-java.lang Throwable?

Ниже приведен некоторый фиктивный код для визуализации моей проблемы:

public class Main
{
    public static final java.net.URL STATIC_URL = new java.net.URL("http://example.com/");
    public static void main(String[] args)
    {
        GUI gui = new GUI();
        gui.setVisible(true);
    }
}
public class GUI extends java.awt.Window
{
    public GUI()
    {
        add(new java.awt.Label(Main.STATIC_URL.toString()));
    }
}

Если вы попытаетесь скомпилировать это, он скажет вам, что вы не можете из-за строки 3. Отсюда мой вопрос.

Ответы [ 4 ]

17 голосов
/ 06 декабря 2011

«Альтернатива», которую я бы предпочел методу @HosamAly:

private static final java.net.URL STATIC_URL = makeUrl("http://www.example.com");

public static java.net.URL makeUrl(String urlString) {
    try {
        return new java.net.URL(urlString);
    } catch (java.net.MalformedURLException e) {
        return null; //Or rethrow an unchecked exception
    }
}
13 голосов
/ 06 декабря 2011

Использование статического инициализатора :

public class Main {
    private static final java.net.URL STATIC_URL;
    static {
        java.net.URL temp;
        try {
            temp = new java.net.URL("http://www.example.com");
        } catch (java.net.MalformedURLException e) {
            temp = null;
        }
        STATIC_URL = temp;
    }
}

Примечание: Использование временной переменной необходимо, чтобы избежать ошибки компиляции при назначении конечной статической переменной.поле дважды.Если поле не final, присваивание может быть выполнено напрямую.

7 голосов
/ 06 декабря 2011

Если вы уверены, что хотите установить URL-адрес. Уверены ли вы? java.net.URL - это один из самых всеобъемлющих классов в JDK. Что касается использования в качестве «константы», то здесь задействован DNS-поиск, и он использует изменяемый статический объект (хотя и защищенный проверкой безопасности, если у вас установлен SecurityManager).

Если он один, статический инициализатор должен быть в порядке.

private static final java.net.URL STATIC_URL;

static {
    try {
        STATIC_URL = new java.net.URL("http://example.com/");
    } catch (java.net.MalformedException exc) {
        throw new Error(exc);
    }
}

(Обратите внимание, вы не можете квалифицировать имя статического поля именем класса.)

Примечание: Вы действительно не хотите null - выдать какую-то ошибку и прекратить загрузку класса. Я установил константу private, так как это действительно не та зависимость, от которой вы хотите зависеть.

Если у вас есть лоты, тогда уместен метод для общего кода и назначения на месте определения.

private static final java.net.URL STATIC_URL = constantURL("http://example.com/");

private static URL constantURL(String str) {
    try {
        return new java.net.URL("http://example.com/");
    } catch (java.net.MalformedException exc) {
        throw new Error(exc);
    }
}

Опять нет нуля!

0 голосов
/ 06 декабря 2011

Единственный способ получить это для компиляции - удалить final и использовать статический блок инициализатора.

/**
 * 
 */
package com.neurologic.example;

import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author The Elite Gentleman
 * @since 06 December 2011
 *
 */
public class StaticUrlTest {

    public static URL url = null;

    static {
        try {
            url = new URL("http://www.google.com");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...