#kotlin
#kotlin
Вопрос:
В следующем фрагменте кода я создал 4 экземпляра CompanionClass и хочу знать, сколько экземпляров я создал, поэтому перепробовал много способов, но не сработало. Здесь я использовал класс сопутствующих объектов для отслеживания объектов, но я знаю, что он не имеет никакого отношения к объектам, потому что keepTrackOfObjects() является статическим. Кто-нибудь может помочь мне решить эту проблему, пожалуйста?
class CompanionClass
{
companion object{
var numberOfObjects = 0
fun keepTrackOfObjects() = println("number of created objects currently is:
${ numberOfObjects}")
}
}
fun main()
{
val obj1 = CompanionClass()
CompanionClass.keepTrackOfObjects()
val obj2 = CompanionClass()`enter code here`
val obj3 = CompanionClass()
val obj4 = CompanionClass()
CompanionClass.keepTrackOfObjects()
}
// output is
// 1
// 2
Комментарии:
1. Создайте список объектов, тогда подсчитать их не составит труда ( kotlinlang.org/docs/reference/collections-overview.html )
2. где вы используете numberOfObjects в своем коде?
3. @Luuk мне не нужно создавать список объектов. Предположим, мне нужен один или два объекта, и я хочу знать, сколько объектов класса я создал. можете ли вы помочь мне без списков.
4. @hfarhanahmed внутри класса сопутствующих объектов.
5. Проблема в том, что сопутствующий объект { var numberOfObjects = 0 } запускается каждый раз при создании нового экземпляра. этот счетчик должен находиться в другом классе, чтобы сохранить предыдущее значение.
Ответ №1:
Вы можете использовать init
блок для подсчета созданных вами элементов:
class CompanionClass {
companion object {
var counter: Int = 0
fun counter(): Int {
return counter
}
}
init {
counter
}
}
Вы можете протестировать поведение на этой игровой площадке kotlin.
Комментарии:
1. Я попробовал ваш фрагмент кода и создал несколько объектов CompanionClass. Когда я печатаю CompanionClass.counter(), он выдает мне 0 в качестве выходных данных, и то же самое верно для obj.counter().
Ответ №2:
Проблема в вашем сопутствующем объекте,
var numberOfObjects = 0
будет инициализировать переменную каждый раз, когда вы создаете новый экземпляр. Итак, создайте эту переменную в отдельном классе, где храните все статическое содержимое, и используйте его оттуда. тогда ваш сопутствующий объект будет таким.
companion object{
fun keepTrackOfObjects() = println("number of created objects currently is:
${ numberOfObjects}")
}
Ответ №3:
Для достижения этого вам следует увеличить ваш numberOfObject в init
инструкции.. Взгляните на приведенный ниже код
class User (var firstName:String,var lastName:String){
companion object {
var numberofinstance:Int = 0
fun getNumberOfInstance() = println("Nombre d'instance = $numberofinstance")
}
init {numberofinstance }
}
Теперь вы можете использовать это в своей основной функции
fun main(){
val user1=User("bob","marley")
val user2=User("bonkey","reynard")
val user3=User("jobbs","steve")
val user4=User("bill","naim")
val user5=User("jeff","romain")
User.getNumberOfInstance()
}
Вывод : Number of instance = 5
Комментарии:
1. Остерегайтесь этого подхода, и все остальные до сих пор, не являются потокобезопасными.