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

博客分析了'java.lang.String'在'tenantId'中的私有访问错误,解释了如何在外部使用静态final属性以及无法访问私有方法的原因。提供了两种解决方案:一是通过内部调用私有构造函数初始化并设置为静态常量;二是仅提供getter方法。还强调了导入static属性的正确方式和创建对象时无参构造函数的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如下图:
这里写图片描述

这里写图片描述

分析错误提示

从代码提示中可以看出,在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中没有显示写无参构造函数, 当没有显示的写无参构造函数时,有参构造函数覆盖了默认的无参构造函数,所以不能用无参构造函数创建对象,没有对象将无法调用方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值