首页 > 解决方案 > 限制对实例变量的访问仅限于该类中的选定方法

问题描述

我想限制或限制对成员的更新,palidromes并且palidromesFIFO仅限于一种方法,例如addPalindromeWord,并且不要让任何其他方法来更新它。有没有办法做到这一点?

目标是在处理向集合添加任何新值时实现模块化。必须遵循一些基本逻辑。我不希望看到任何其他以抽象方式直接影响集合的方法。

static class MyPalindromes{
    private Set<String> palidromes;
    private Deque<String> palidromesFIFO;
    private int maxLenOfCache;
    public MyPalindromes(int maxCachingLength) {
        palidromes = new TreeSet<>(new MyComparator()); 
        palidromesFIFO = new ArrayDeque<String>();
        maxLenOfCache = maxCachingLength;
    }
    
    public void addPalindromeWord(String word) {
        palidromes.add(word);
        
        if (palidromesFIFO.size() == maxLenOfCache && !palidromesFIFO.isEmpty()) {
            palidromesFIFO.removeFirst();
        }
        if (maxLenOfCache > 0) {
            palidromesFIFO.addLast(word);
        }
    }
    
    public void filterAndAddOnlyPalindromes(List<String> words) {
        List<String> validWords = new ArrayList<>();
        for (String w : words) {
            if (isPalindrome(w)) {
                validWords.add(w);
            }
        }
        this.addPalindromeWords(validWords);  
    }
    public void addPalindromeWords(List<String> words) {
        for (String word : words) {
           // palidromes.add(validWords);   //<< DISALLOW this direct update to the set 
           this.addPalindromeWord(word); // << ONLY allow update through addPalindromeWord method
        }
    }
}

标签: javaoopaccess-controlsystem-design

解决方案


您可以将您的集合“嵌套”在class仅公开这些方法的专用(可选内部)中。然后外部类无法访问私有字段和方法,并且您Collection可以通过其他方式进行修改。

但是,您还必须确保Collection不返回 ,否则开发人员可以直接修改它。通过从内部类中的集合委派任何纯粹的读取操作来做到这一点。

如果你这样做'足够通用',你只需要一堆类来处理这个。在周围建立一个小型图书馆实际上是一件好事。


推荐阅读