Tips 2 인코딩 - 다른 빈 포인터 처리 방법

2339 단어
일상적인 개발에서 우리는 반드시 빈 바늘 문제에 시달려 붕괴된 적이 있다. 조금만 주의하지 않으면 크라쉬가 무더기로 발생할 수 있다. 그 다음에'obj!=null'을 추가해서 처리한다. 번거로우면 안 된다. 비록 우리는 이미 Kotlin을 사용해서 이런 문제를 완화시키기 시작했지만 빈 대상의 조작은 여전히 번거롭다. 특히 체인식 호출에서 일련의'?'라고 써야 한다.다음은 제가 프로젝트에서 실천한 두 가지 방식입니다. 일부 상황에서 빈 지침 문제를 최대한 줄일 수 있습니다.
기본 객체
class LocMsg(val lat: Long, val lng: Long, val dir: Int) {
    companion object {
        val INVALID_LOC = LocMsg(0, 0, 0)
    }

    fun isValid(): Boolean = this !== INVALID_LOC
    
    //  
}

class MainPage {
    var mLoc = LocMsg.INVALID_LOC

    fun setLoc(loc: LocMsg) {
        mLoc = loc
    }

    fun refreshMap() {
        mMap.setLoc(mLoc)
    }
    
    fun getDistance(loc: LocMsg): Double = if (mLoc.isValid()) mLoc.distance(loc) else Double.MAX_VALUE
}

위 데모에서는 고정 객체 INVALID 를 사용합니다.LOC는null을 대체합니다. 기본값을 부여해야 하는 곳에서INVALIDLOC를 설정하면 됩니다. 이렇게 하면 대부분의 상황에서 우리는 더 이상 공중 판정 조작을 할 필요가 없습니다. 또한 isValid() 방법을 제공하여 유효성에 대한 판단이 필요한 장면에 사용할 수 있습니다. 그러면 우리는 대량의 공중 판정 조작을 줄이는 동시에 공중 지침의 안전성을 확보할 수 있습니다.
여기의 데모는 우리가 사용하는 Kotlin을 작성합니다. isValid 방법에서 우리가 사용하는 것은 '! = =' 방식으로 대상이 유효한지 판단하는 것입니다. 왜냐하면 '! =' 은 Kotlin에서 실제적으로 호출된 대상의 equals 방법이기 때문에 판단 오류가 발생할 수 있습니다. (예: 데이터 클래스)
기본 클래스
interface IDisplay {
    fun display(canvas: Canvas)

    fun isValid(): Boolean = this !is InvalidDisplay
}

class TextDisplay : IDisplay {
    override fun display(canvas: Canvas) {
        canvas.drawText()
    }
}

class ImageDisplay : IDisplay {
    override fun display(canvas: Canvas) {
        canvas.drawBitmap()
    }
}

class InvalidDisplay : IDisplay {
    override fun display(canvas: Canvas) {
        // do nothing
    }
}

class MainPage {
    private val mDisplay = createDisplay(mType)

    fun refresh(canvas: Canvas) {
        mDisplay.display(canvas)
    }
    
    fun isUsable(): Boolean = mDisplay.isValid()

    fun createDisplay(type: Int) : IDisplay {
        when(type) {
            TYPE_TEXT -> TextDisplay()
            TYPE_IMAGE -> ImageDisplay()
            else -> InvalidDisplay()
        }
    }
}

위의Demo에서 우리는 기본적인 빈 실현 클래스를 사용하여null을 대체했다. 또한 대량의 빈 판정 조작을 경감시키는 역할을 할 수 있을 뿐만 아니라 isValid () 방법으로 특수한 수요를 만족시킬 수 있다.
총결산
사실 위의 두 가지 방법의 사고방식은 모두 똑같다. 모두 특수한 대상으로null을 교체한다. 비록 간단한 기교이지만 때로는 우리의 코드를 더욱 건장하게 할 수도 있다.

좋은 웹페이지 즐겨찾기