2010-12-31 3 views
2

У меня есть класс, который я использую в качестве таблицы. Этот класс получил массив из 16 классов строк. Эти классы строк имеют 6 двойных переменных. Значения этих строк устанавливаются один раз и никогда не изменяются.Создать класс таблицы как singleton

Было бы хорошей практикой сделать этот стол одним сингл? Преимущество заключается в том, что он дешевле памяти, но таблица будет вызываться из нескольких потоков, поэтому мне нужно синхронизировать мой код, который вызывает более медленное приложение. Однако поиск в этой таблице, вероятно, является очень небольшой частью общего кода, который выполняется.

EDIT: Это мой код, есть ли лучшие способы сделать это или это хорошая практика? Удалено синхронизированное ключевое слово в соответствии с рекомендациями в этом вопросе.

final class HalfTimeTable { 
    private HalfTimeRow[] table = new HalfTimeRow[16]; 
    private static final HalfTimeTable instance = new HalfTimeTable(); 

    private HalfTimeTable() { 
     if (instance != null) { 
      throw new IllegalStateException("Already instantiated"); 
     } 
     table[0] = new HalfTimeRow(4.0, 1.2599, 0.5050, 1.5, 1.7435, 0.1911); 
     table[1] = new HalfTimeRow(8.0, 1.0000, 0.6514, 3.0, 1.3838, 0.4295); 
     //etc 
    } 

    @Override 
    @Deprecated 
    public Object clone() throws CloneNotSupportedException { 
     throw new CloneNotSupportedException(); 
    } 

    public static HalfTimeTable getInstance() { 
     return instance; 
    } 

    public HalfTimeRow getRow(int rownumber) { 
     return table[rownumber]; 
    } 
} 
+0

Немного не по теме, но вам не нужно переопределять 'clone', если ваш класс явно не реализует интерфейс' Cloneable'. Кроме того, 'getInstance', вероятно, должен быть статическим :) –

+0

Я не знал о клоне. Я где-то читал, что вы должны переопределить его, чтобы избежать клонирования одиночек. Конечно, мой getInstance был статичным. Удалил его в вопросе случайно. –

ответ

3

Это полностью зависит от того, как будет использоваться ваш класс. Вы только хотите сделать это синглом, если вы абсолютно уверены, что хотите в любой момент всего один экземпляр (за JVM).

К сожалению, не зная подробностей о том, что делает ваш код, невозможно дать окончательный ответ.

Вы когда-нибудь хотели бы иметь две разные таблицы? Вы говорите, что данные в таблице никогда не меняются, но могли бы вы создать две таблицы, содержащие разные данные? Если это так, одноэлемент не подходит. Если вы уверены, что вам нужен только один экземпляр, то синглтон в порядке.

+0

Все данные не будут оставаться неизменными. Это чистая таблица поиска значений, которые будут использоваться с вычислениями. Значения можно сравнить, например, 'sizeOfEarth = 16000km'. Это факты, обсуждение невозможно;). –

+0

@Mark: Определенно идти за синглом. –

2

Значения этих строк устанавливаются один раз и никогда не изменится.

Да, в этом случае хорошая идея, но почему вы синхронизируете, хотя это только чтение?

1

Вам не нужно реализовывать одноэлементный шаблон для совместного использования объекта между клиентами. Вы можете создать его один раз и перейти к другим объектам во время строительства.

Если вы используете The values of these rows are set once and never change, то вы имеете в виду, что таблица и ее значения полностью построены до ее использования ее клиентом, вы имеете доступ к информации только для чтения. Это означает, что синхронизация не требуется.

+0

Tnx для информации. Я не был уверен, что если чтение одного блока памяти несколькими потоками вызовет проблемы. –

0

Как org.live.java сказал - если вы, например, инициализировать таблицу в его конструктор (не ленитесь), то нет никаких причин, чтобы синхронизировать

Смежные вопросы