确保对象始终是List的成员?

时间:2013-03-29 11:52:59

标签: java list design-patterns

想象一下:

每个单词都是一个字符列表。然而,本身不可能存在任何角色,它总是必须是一个单词的一部分。

所以Word类看起来像这样:

class Word extends List<MyCharacter>

现在,如何强制实施不能MyCharacter不属于Word的{​​{1}}?也许让MyCharacter成为Word的私有内部类,并向addCharacter(String character)添加Word等方法?但是,当WordMyCharacter的私有内部类时,是否可以让Word扩展List类?

感谢您提供任何暗示!

更新

我现在最终到了

import java.util.ArrayList;

public final class Word extends ArrayList<Word.MyCharacter> {

    protected final class MyCharacter
    {
        private String character;

        public String getCharacter() {
            return character;
        }

        public MyCharacter(String character)
        {
            this.character=character;
        }
    }

    public void addCharacter(String character) {
        add(new MyCharacter(character));
    }   
}

以下是它的使用方法:

public static void main(String[] args) {

    Word word = new Word();

    // word.add(new MyCharacter("a")); // as intended: not possible, because MyCharacter class can't be accessed
    word.addCharacter("a"); // ok           
}

2 个答案:

答案 0 :(得分:1)

  

也许将Character作为Word的私有内部类并向Word添加类似addCharacter(String character)的方法?

是。 - 或者可能只声明MyCharacter私有和MyCharacterfinal的构造函数。或者声明MyCharacter以外的Word课程,其中包含&#39; package-private&#39;构造函数。或者在MyCharacter appendToWord( Word w, Character char )内部有一种(静态)工厂方法和私有构造函数。或......: - )

编辑:我首先误解了这个问题:

  

是否可以让Word使用私有内部Character类扩展List类?

Word可以任何方式扩展List<T>。但是 - 你想出来的不是List<Word.SomeInnerClass>

答案 1 :(得分:1)

理论上这是可能的。将出现一个问题:Character已经是一个java类。此外,如果您正在使用Eclipse,则不会让您声明

public class Word extends ArrayList<Letter> {
    private class Letter {
        //...
    }
}

除非你最多保留信件。我不确定这是一个Eclipse问题,还是Java也会阻止你。

关于你的超类问题,这是因为你不能使用List,因为它只是一个接口。你必须使用实现它的东西,比如ArrayList。