I always find the code just like Code A in CameraX project. It creates instances 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 instantiate an object in a class with Kotlin? Is Code A better than Code B ?
BTW, I don't imagine that "Every Fragments class must have an empty constructor". Would you please consider a normal class instead of Fragments class?
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])