'TenantId(java.lang.String)' has private access in 'com.dxc.mongodb.TenantId'

来源:互联网 发布:复权价格 知乎 编辑:程序博客网 时间:2024/05/17 23:00

如下图:
这里写图片描述

这里写图片描述

分析错误提示

从代码提示中可以看出,在TenantId类中,由于TenantId构造函数是私有的,所以在外面不能访问此构造函数

代码例子:

test.java

package com.yubai.sample.repository;public class test {    public static void main(String[] args) {        Book b = new Book("java");        System.out.println(b.getName());    }}

此时 Book b = new Book(“java”);就会报错’Book(java.lang.String)’ has private access in ‘com.yubai.sample.repository.Book’

Book.java

package com.yubai.sample.repository;public class Book {    private String name;    private Book(String name) {        this.name = name;    }    public String getName() {        return name;    }}

分析代码关于访问私有属性的方法

从Book.java代码可以看出:
1. name属性的值无法访问,因为对象无法创建,有参构造函数是private无法创建对象,而Book.java中也没有提供无参构造函数,所以无法创建对象,那么无法访问getName()方法,从而无法获得name属性的值。
2. 一般在非私有构造函数的情况下,如果想修改私有属性,是通过setName()
3. 如果想访问name属性的值,又不想被外界通过setXXX()方法改变name属性的值,那么只能在内部类中设置好name的初始值,并且把它设为私有的,外部不能修改的,解决办法如下两种(目前我能想到的)。

解决办法:

第一种:
首先初始化属性值:通过在类内部调用私有构造函数创建(构造函数私有,外部将无法创建对象,也就是无法调用私有构造函数,那么将无法修改name属性的值)
设置属性为全局变量:设置属性为public static final,因为可以在外部import类名.属性名后,可以直接使用属性名。如下代码:

package com.yubai.sample.repository;public class Book {    private String name;    public static final Book BOOK = new Book("java");    private Book(String name) {        this.name = name;    }    public String getName() {        return name;    }    @Override    public String toString() {        return BOOK.name;    }}

test.java

package com.yubai.sample.repository;import static com.yubai.sample.repository.Book.BOOK;public class test {    public static void main(String[] args) {        System.out.println(BOOK);    }}

第二种:初始化属性值,仅提供getName()方法。

package com.yubai.sample.repository;public class Book {    private String name = "aaa";    public String getName() {        return name;    }}

test.java

package com.yubai.sample.repository;import static com.yubai.sample.repository.Book.BOOK;public class test {    public static void main(String[] args) {    Book book = new Book();    System.out.println(book.getName());    }}

相比较第一种方法,我觉得第一种更方便对于获取name属性的值。因为第一种方法只要引入import static com.yubai.sample.repository.Book.BOOK; 就可以直接运用BOOK属性。而第二种方法要想获得name属性的值,需要通过String name= book.getName();语句来获得,相对比较繁琐。 根据不同的需求运用不同的方法。

分析代码关于static final 属性外部怎么直接使用

如果要使用static final的属性,则需要import static 包名.类名.属性,而不是import类名

代码如下:
test.java

package com.yubai.sample.repository;//import static com.yubai.sample.repository.Book.BOOK;import static com.yubai.sample.repository.Book;//报错。cannot resolve symbol 'BOOK'public class test {    public static void main(String[] args) {        System.out.println(BOOK);//报错。cannot resolve symbol 'BOOK'    }}

当直接使用BOOK属性时,报错,应该导入注释掉的包
当导入的是类名,则使用BOOK属性的格式:Book.BOOK(类名.属性名)
显然直接使用BOOK属性较Book.BOOK方便。

如下导入的包是类名

package com.yubai.sample.repository;import static com.yubai.sample.repository.Book;public class test {    public static void main(String[] args) {        System.out.println(Book.BOOK);    }}

分析代码关于不能访问方法,因为无法创建对象

代码块

Book.java

package com.yubai.sample.repository;public class Book {    private String name;    public static final Book BOOK = new Book("spring boot");    private Book(String name) {        this.name = name;    }    public String getName() {        return name;    }   }

test.java

package com.yubai.sample.repository;public class test {    public static void main(String[] args) {        Book b = new Book(); //报错:'Book(java.lang.String)' has private access...        System.out.println(b.getName());    }}

此时Book b = new Book();会报错,因为Book.java中没有显示写无参构造函数, 当没有显示的写无参构造函数时,有参构造函数覆盖了默认的无参构造函数,所以不能用无参构造函数创建对象,没有对象将无法调用方法。

阅读全文
0 0