Итак, я пытаюсь инициализировать DatagramSocket
в конструкторе, и я хочу, чтобы это поле было final
, но мой компилятор (т.е. Eclipse) выдает мне следующую ошибку:
Пустое конечное поле дейтаграммы
возможно, не было инициализировано
Это понятно. Вот фрагмент кода:
public class Foo
{
private final int DEFAULT_UDPLISTENPORT = 49400;
private final DatagramSocket datagramSocket;
public Foo()
{
synchronized(this)
{
try
{
datagramSocket = new DatagramSocket(DEFAULT_UDPLISTENPORT);
}
catch (SocketException e)
{
// Log error
logger.error("Trouble opening UDP port: ", e);
}
}
}
}
Теперь я знаю, что есть способ обойти это, но мне нужно создать временную переменную. Вот фрагмент кода:
public class Foo
{
private final int DEFAULT_UDPLISTENPORT = 49400;
private final DatagramSocket datagramSocket;
public Foo()
{
synchronized(this)
{
DatagramSocket tempSocket = null;
try
{
tempSocket = new DatagramSocket(DEFAULT_UDPLISTENPORT);
}
catch (SocketException e)
{
// Log error
logger.error("Trouble opening UDP port: ", e);
}
datagramSocket = tempSocket;
}
}
}
Итак, я предполагаю, что мой вопрос: есть ли более элегантный способ сделать это, или это то, что мне просто нужно жить с , если я хочу этого поле будет final
?
EDIT:
Для тех из вас, кто заинтересован, вот решение, которое я придумал из ваших рекомендаций:
public class Foo
{
private static final Foo INSTANCE;
static
{
try
{
INSTANCE = new Foo();
}
catch (SocketException e)
{
throw new ExceptionInInitializerError(e);
}
}
private final int DEFAULT_UDPLISTENPORT = 49400;
private final DatagramSocket datagramSocket;
public Foo() throws SocketException
{
synchronized (this)
{
datagramSocket = new DatagramSocket(DEFAULT_UDPLISTENPORT);
}
}
public static Foo getInstance()
{
return INSTANCE;
}
}
Пожалуйста, дайте мне знать, если это правильно, или если у вас есть какие-либо другие предложения. Я ценю помощь!