导致创建多个注释实例的逻辑问题

Logical problems causing multiple instances of a note to be created

这是 class 注释的(没有大部分功能)定义。

   public class Note
    {
        private String text;
        String fileName = "";
        NoteManager noteManager = null;
        List<String> hyperlinks = new ArrayList<String>();

        public static final int BUFFER_SIZE = 512;

        public Note(NoteManager noteManager) {
            this.noteManager = noteManager;
            this.text = "";
        }

        public Note(NoteManager noteManager, String content) {
            this(noteManager);
            if (content == null)
                setText("");
            else
                setText(content);
        }

        public Note(NoteManager noteManager, CharSequence content) {
            this(noteManager, content.toString());
        }

        ....some functions....

        public static Note newFromFile(NoteManager noteManager, Context context,
            String filename) throws IOException
        {

        FileInputStream inputFileStream = context.openFileInput(filename);
        StringBuilder stringBuilder = new StringBuilder();
        byte[] buffer = new byte[BUFFER_SIZE];
        int len;
        while ((len = inputFileStream.read(buffer)) > 0)

         {
            String line = new String(buffer, 0, len);
            stringBuilder.append(line);

            buffer = new byte[Note.BUFFER_SIZE];
        }

        Note n = new Note(noteManager, stringBuilder.toString().trim());
        n.fileName = filename;

        inputFileStream.close();

        return n;
    }

       .... some functions attributed to this class

}

这些笔记由名为 NoteManager.java 的 class 管理,我将其缩写如下:

public class NoteManager
{
    Context context=null;
    ArrayList<Note> notes = new ArrayList<Note>();

    ..... some functions...

    public void addNote(Note note)
    {
        if (note == null || note.noteManager != this ||   notes.contains(note)) return;
        note.noteManager = this;
        notes.add(note);    
        try
        {
            note.saveToFile(context);
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }


    ....some functions....

    public void loadNotes()
    {
        String[] files = context.fileList();
        notes.clear();
        for (String fname:files)
        {
            try
            {
                notes.add(Note.newFromFile(this, context, fname));
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }

    }
}

public void addNote(Note note)
    {
        if (note == null || notes.contains(note)) return;
        note.noteManager = this;
        notes.add(note);    
        try
        {
            note.saveToFile(context);
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }

我想弄清楚为什么这个记事本应用程序在完全关闭然后重新打开时会创建随机的新笔记,但我就是看不出问题出在哪里。我已经删除了所有似乎与问题无关的功能,所以逻辑错误一定在这里。

如何找到我猜测是某种循环引用或缺少检查的内容?

Android 通常使用带有多字节字符的 UTF-8。如果您偏离 ASCII,在任意字节子数组上创建新字符串可能会在开始和结束处出现问题。

public static Note newFromFile(NoteManager noteManager, Context context,
        String filename) throws IOException
{
    Path path = Paths.get(filename);
    byte[] bytes = Files.readAllBytes(path);
    String content = new String(bytes,  "UTF-8");

    Note n = new Note(noteManager, content.trim());
    n.fileName = filename;
    noteManager.add(n); // One registration?
    return n;
}

节点有多个实例的问题可能需要在 newFromFile 中添加或者可能需要额外检查:

public void addNote(Note note)
{
    if (note == null || note.noteManager != this || notes.contains(note)) {
        return;
    }
    note.noteManager = this;
    notes.add(note);    

最后一个注释必须明确定义。

public class Note extends Comparable<Note> {

    private NoteManager noteManager:
    private final String content; // Immutable.

    public NoteManager(NoteManager noteManager, String content) {
        this.noteManager = noteManager;
        this.content = content;
    }
    ... compare on the immutable content
    ... hashCode on content

不可更改内容,在字符串内容上进行比较,表示音符不能加倍,更改集合,混淆集合顺序。