基于对象状态(例如,基于解析状态)的获取器/属性的可用性

时间:2019-06-07 01:04:09

标签: java oop object kotlin

假设我有一个具有内部状态的解析器。其中之一对应于完整且成功的解析。解析器具有包含解析结果的字段。只有完整且成功的解析,字段才可用。否则,在访问该字段时,将引发异常。

interface Parser {

    fun parse()
}

interface Data {

    val propertyA: String
}

class SimpleParser: Parser, Data {

    private var parserState = SimpleParserState.UNPARSED

    // property (getter), available only when state equals to PARSED_ALL (i.e. if parsing done successfully)
    private lateinit var _propertyA: String
    override val propertyA: String
        get() {
            if (parserState === SimpleParserState.PARSED_ALL) {
                return _propertyA
            }
            throw IllegalStateException("Parser's state is not PARSED_ALL. This property is unavailable")
        }

    override fun parse() {
        if (parserState !== SimpleParserState.UNPARSED) {
            throw IllegalStateException("Already parsed!")
        }
        // DO PARSING LOGIC
        _propertyA = "parsed string"
        parserState = SimpleParserState.PARSED_ALL
    }
}

enum class SimpleParserState {

    UNPARSED, PARSED_ALL, PARSED_PARTIAL, PARSED_NONE
}

当数据和逻辑存储在一个对象中时,此方法正确吗? 还有哪些其他符合OOP原则的替代方案?

1 个答案:

答案 0 :(得分:0)

一个选项:让parse()方法返回解析结果(而不是将其存储在解析器的状态中)。该结果可能是具有两个具体子类的抽象类:一个用于成功(对于相关的结果信息使用getter),而一个对于失败(对于失败的原因使用getter)。