gpt4 book ai didi

java - 树结构游标API

转载 作者:行者123 更新时间:2023-12-04 05:31:00 24 4
gpt4 key购买 nike

我现在正在为树结构重写一个游标 API。我有这样的方法:

/**
* Move cursor to parent node of currently selected node.
*
* @return the cursor instance
*/
INodeCursor moveToParent();

/**
* Move cursor to first child node of currently selected node.
*
* @return the cursor instance
*/
INodeCursor moveToFirstChild();

以及相应的 boolean hasParent() 和 hasFirstChild()... 方法。到目前为止,moveToX() 方法也返回了一个 boolean 值,但我认为是这样的:
trx.moveToParent().moveToParent().insertFirstChild(...).moveToRightSibling() ...如果你知道你在做什么,会更有趣。但是,我不确定如果失败该怎么办(返回 null 以立即生成 NPE?)。也许最好返回游标实例并且调用者必须意识到游标可能根本没有被移动。

感谢您的任何建议。

编辑:也许这也是 Google Guava Optional 的一个用例?这样我就从两者中获得了最好的?
trx.moveToRightSibling().get().moveToRightSibling().get().insertTextAsFirstChild("foo")

if (trx.moveToRightSibling.isPresent()) && trx.moveToRightSibling.isPresent() && "foo".equals(rtx.getValue) { ... }
加上额外的 trx.hasRightSibling()... 方法。所以也许是一个自我编写的简单包装器,具有大致相同的语义但不同的名称。
if (trx.moveToRightSibling().didSucceed() && ...)trx.moveToRightSibling().get().moveToRightSibling().get() ...)
编辑2:例如:
/**
* Determines if the {@link INodeCursor} moved to a node or not. Based on the
* idea of providing a wrapper just like in Google Guava's {@link Optional}
* class.
*
* @author Johannes Lichtenberger
*
* @param <T>
* type parameter, the cursor
*/
public abstract class Move<T extends INodeCursor> {
/**
* Returns a {@link Moved} instance with no contained reference.
*/
@SuppressWarnings("unchecked")
public static <T extends INodeCursor> Move<T> notMoved() {
return (Move<T>) NotMoved.INSTANCE;
}

/**
* Returns a {@code Moved} instance containing the given non-null reference.
*/
public static <T extends INodeCursor> Moved<T> moved(final @Nonnull T pMoved) {
return new Moved<T>(checkNotNull(pMoved));
}

/**
* Determines if the cursor has moved.
*
* @return {@code true} if it has moved, {@code false} otherwise
*/
public abstract boolean hasMoved();

/**
* Get the cursor reference.
*
* @return cursor reference
*/
public abstract T get();
}

编辑 3: 和我的 moveTo(long)-method,其中所有其他 moveToX()-methods 都基于:
@Override
public Move<? extends INodeCursor> moveTo(final long pNodeKey) {
assertNotClosed();
if (pNodeKey == EFixed.NULL_NODE_KEY.getStandardProperty()) {
return Move.notMoved();
}

// Remember old node and fetch new one.
final INode oldNode = mCurrentNode;
Optional<? extends INodeBase> newNode;
try {
// Immediately return node from item list if node key negative.
if (pNodeKey < 0) {
if (mItemList.size() > 0) {
newNode = mItemList.getItem(pNodeKey);
} else {
newNode = Optional.absent();
}
} else {
final Optional<? extends INodeBase> node = mPageReadTrx.getNode(
pNodeKey, EPage.NODEPAGE);
newNode = node;
}
} catch (final SirixIOException e) {
newNode = Optional.absent();
}

if (newNode.isPresent()) {
mCurrentNode = (INode) newNode.get();
return Move.moved(this);
} else {
mCurrentNode = oldNode;
return Move.notMoved();
}
}

最佳答案

基于以上评论:

问题归结为:
1)我应该使用 boolean 返回还是实例

无论哪种方式都需要错误检查:

if (trx.moveToParent()) {
if (trx.moveToParent()) {
trx.doSomething();

对比
try {
trx.moveToParent().moveToParent().doSomething();
}
catch(NPE ex) {

第一种方式稍微明显一点,就是trx被修改了,但是使用起来有点不方便(比如报错需要一个 else每个条件[设置一个flag,然后根据这个flag做一个单一的报错] )

不改变节点的想法与返回 boolean 值相同,但更丑
trx.noveToParent();
if (trx.didMove()) {
trx.moveToParent();
if (trx.didMove()) {
trx.doSomething();

如果是我,我会返回节点并抛出 NPE - 您确实需要确保您的变量正确更新。即 trx.moveToParent().moveToParent() 实际上修改了 trx 两次,而不是一次更改为 trx 一次更改为某个匿名副本。好的单元测试在这里会有所帮助。

关于java - 树结构游标API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12632436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com