Java中的内部类与私有访问

hmmo2u0o  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(99)

我有一个现有的类如下:

public class A {

    private Map<Integer, String> map = new HashMap();
    
    public class B{
        private String name;

        public B(String name) {
            this.name=name;
        }

        //name getter
    }

    public void start() {
        map.put(1, "One"); // example implementation
    }

    public B stop(int val) {
         return new B(map.get(val)); // example implementation
    }

}

现在我想修改类B以返回两个名称,即name1和name2,并希望在HashMap中存储一对值,如下所示:

public class A {

        private Map<Integer, String> map = new HashMap();
        
        public class B{
            private String name1;
            private String name2;

            public B(String name1, String name2) {
                this.name1=name1;
                this.name2=name2;
            }

            // getters for name1 and name2
        }

        public void start() {
            Pair<String, String> pair = new Pair("One", "Una");
            map.put(1, pair);
        }

        public B stop(int val) {
             if(map.containsKey(val)) {
                return new B(map.get(val).getKey(), map.get(val).getValue());
             }
             return null;
        }
    
    }

现在我想使用一个自定义类对象来代替Pair。我是Java内部类的新手。如果一个内部类是用来在HashMap中存储一组值,以供类A的内部处理,而不应该暴露在类A之外,那么创建内部类的最佳方法是什么?还有其他建议吗?

g2ieeal7

g2ieeal71#

还有其他建议吗?
假设我理解这个问题,如果你想返回一个类,那么它的存在必须是已知的,这样接收者才能访问元素。即使它作为一个简单的对象传递,唯一有用的方法也是toString(),因为要访问单个元素,必须首先将Object转换为所讨论的类。
至于使用内部类,为什么不使用record(在Java 14中引入)?这是创建不可变类的一种简单方法。

  • 您可以直接访问这些值
  • 你可以使用getter。
  • 它有默认constructortoString()(如果愿意,可以覆盖toString
record Pair(String v1, String v2) {}
Pair v = new Pair("ABC", "DEF");
System.out.println(v);       // toString
System.out.println(v.v1());  // getter
System.out.println(v.v2);  // direct access

印刷品

Pair[v1=ABC, v2=DEF]
ABC
DEF

要覆盖toString,只需将标准定义放在{}

相关问题