I always find the code just like Code A in CameraX project. It creates instance using a object inside companion object
within a class.
If I write the same code, I will use Code B.
Is it a good way to instance an object in a class with Kotlin? Is Code A better than Code B ?
Code A
class UIFragmentPhoto internal constructor() : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?) = ImageView(context)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val args = arguments ?: return
val resource = args.getString(FILE_NAME_KEY)?.let { File(it) } ?: R.drawable.ic_photo
Glide.with(view).load(resource).into(view as ImageView)
}
companion object {
private const val FILE_NAME_KEY = "file_name"
fun create(image: File) = UIFragmentPhoto().apply {
arguments = Bundle().apply {
putString(FILE_NAME_KEY, image.absolutePath)
}
}
}
}
Invoke A
override fun getItem(position: Int): Fragment = UIFragmentPhoto.create(mediaList[position])
Code B (Modified)
class UIFragmentPhoto internal constructor() : Fragment() {
val FILE_NAME_KEY = "file_name"
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?) = ImageView(context)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val args = arguments ?: return
val resource = args.getString(FILE_NAME_KEY)?.let { File(it) } ?: R.drawable.ic_photo
Glide.with(view).load(resource).into(view as ImageView)
}
constructor(image: File):this(){
arguments = Bundle().apply {
putString(FILE_NAME_KEY, image.absolutePath)
}
}
}
Invoke B (Modified)
override fun getItem(position: Int): Fragment = UIFragmentPhoto(mediaList[position])
from Is it a good way to instance an object in a class with Kotlin?
No comments:
Post a Comment