У меня есть некоторый класс C:
class C (...) { ... }
Я хочу использовать его для индексации эффективной карты. Самой эффективной картой является Массив. Таким образом, я добавляю "глобальный" "статический" счетчик в сопутствующем объекте дать каждый объектный уникальный идентификатор:
object C {
var id_counter = 0
}
В основном конструкторе C с каждым созданием C я хочу помнить глобальное встречное значение и увеличить его.
Вопрос 1: Как сделать это?
Теперь я могу использовать идентификатор в объектах C как идеальный хеш для индексации массива. Но массив не сохраняет информацию о типе как карта, был бы, что данный массив индексируется идентификатором C.
Вопрос 2: действительно ли возможно иметь его с безопасностью типов?
Обновление:
Безопасность с точки зрения типов рассматриваемые 2 типа проблем индекса карты, чтобы не смешиваться два не связанный ints. Значение, конечно, (вводят) безопасный..
Вопрос 1 спрашивает, как увеличить переменную в конструкторе по умолчанию?
Т.е.: Куда поместить?
id_counter += 1
Ответ на ваш вопрос 2:
case class C_Id(val asInt: Int)
object C {
private var list: ArrayBuffer[C]
// resizable array in scala.collection.mutable
// you can also use ArrayList
def apply(id: C_Id) = list(id.asInt) // only accepts an id of C
...
}
class C (...) {
// in constructor:
list += this
}
К отредактированному вопросу 1: Конструктор по умолчанию - это просто тело типа, за исключением определений методов и других конструкторов.
Я не вижу проблемы. Я бы, вероятно, сделал счетчик приватным, чтобы код вне class
и object
C
не мог его изменить. Увеличение var
типа Int
тривиально:
idCounter += 1
Массивы в Scala безопасны с точки зрения типов, поскольку они реализуются непосредственно массивами JVM (начиная с версии 2.8).
Подозреваю, что я не совсем понял ваши вопросы...
Обновление:
Инкрементировать счетчик в конструкторе, предположительно.
Что касается создания действительно идеальной хэш-функции, я не думаю, что вы на правильном пути. (Вы просто перенесли отображение от любых реальных ключей в свой собственный код). Вам следует почитать о технике создания минимальных и/или идеальных хэш-функций.
Не могли бы вы сделать конструктор по умолчанию C приватным и предоставить метод фабрики в объекте-компаньоне (который мог бы легко обрабатывать обновление счетчика)?
.