从另一个 class 使用私有 class 构造函数访问内部子 class
Accessing an inner subclass with private class constructor from another class
我正在创建 SQL 数据库并且我基于 this site.
问题是,我不知道如何访问内部 class' 方法,而外部 class 具有私有构造函数。
public class MyDBHandler {
private MyDBHandler() {
}
public static class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "Tasks";
public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
}
public class FeedReaderDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "myDatabase.db";
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public long saveTasks(String title) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(FeedEntry.COLUMN_NAME_TITLE, title);
long newRowId = db.insert(FeedEntry.TABLE_NAME, null, contentValues);
return newRowId;
}
}
}
我正在尝试从另一个 java 文件的 onClick(View v) 方法访问 saveTasks(String title) 方法。
我这样试过:
MyDBHandler.FeedReaderDbHelper dbHelper = new MyDBHandler.FeedReaderDbHelper(v.getContext());
但我当然会收到“MyDBHandler 不是封闭的 class”错误。
或
MyDBHandler.FeedReaderDbHelper dbHelper= new MyDBHandler().new FeedReaderDbHelper(v.getContext());
但是,Android 工作室一直告诉我:“MyDbHandler 有私人访问权限”
甚至可以那样做吗?
如果你真的想保留你的内在 class 然后将其设为静态并按如下方式使用它:
new MyDBHandler.FeedReaderDbHelper(getContext())
MyDbHandler has a private access
这不是关于内部class,而是关于class
中的构造函数
private MyDBHandler() {
}
我想我以前看过这个指南(网站),但我真的不知道他们为什么将其添加为内部 class。我记得他们说过要将构造函数设为私有,这样就没有人可以从中创建对象。
所以只需将 FeedReaderDbHelper
移动到一个单独的文件,然后它就可以工作了。
但如果出于某种原因你想将其保留在内部 class 然后将其定义为静态
public static class FeedReaderDbHelper
然后调用相同的代码,它应该可以工作
内部class只是一种将真正属于原始外部class的某些功能完全分离的方法。它们旨在在您有 2 个要求时使用:
- 你的外部 class 中的一些功能是最清楚的
如果它是在单独的 class.
中实现的
- 即使它在一个单独的 class 中,功能也非常紧密地联系在一起
使外部 class 工作的方式。
鉴于这些要求,内部 classes 可以完全访问其外部 class。由于它们基本上是外部 class 的成员,因此它们可以访问外部 class 的方法和属性是有道理的——包括私有
方法如下:
new MyDBHandler.FeedReaderDbHelper(getContext())
I have run your code by following way, Please have a look.
public class MyDBHandler {
public static FeedReaderDbHelper feedReaderDbHelper;
private MyDBHandler() {
}
public static FeedReaderDbHelper getFeedReaderDbHelper()
{
if(feedReaderDbHelper == null)
feedReaderDbHelper = new MyDBHandler(). new FeedReaderDbHelper();
return feedReaderDbHelper;
}
public static class FeedEntry {
public static final String TABLE_NAME = "Tasks";
public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
}
public class FeedReaderDbHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "myDatabase.db";
public FeedReaderDbHelper() {
//super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public long saveTasks(String title) {
System.out.println(title);
return 1L;
}
}
public static void main(String[] args) {
MyDBHandler.getFeedReaderDbHelper().saveTasks("title");
}
}
您可以将内部 class 静态化以使用它
public class MyDBHandler {
private MyDBHandler() {
}
public static class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "Tasks";
public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
}
public static class FeedReaderDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "myDatabase.db";
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public long saveTasks(String title) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(FeedEntry.COLUMN_NAME_TITLE, title);
long newRowId = db.insert(FeedEntry.TABLE_NAME, null, contentValues);
return newRowId;
}
}
}
现在要获取 FeedReaderDbHelper 实例,您可以
MyDBHandler.FeedReaderDbHelper dbHelper = new MyDBHandler.FeedReaderDbHelper(v.getContext());
并调用方法
String title = "your title";
dbHelper.saveTasks(title)
我正在创建 SQL 数据库并且我基于 this site. 问题是,我不知道如何访问内部 class' 方法,而外部 class 具有私有构造函数。
public class MyDBHandler {
private MyDBHandler() {
}
public static class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "Tasks";
public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
}
public class FeedReaderDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "myDatabase.db";
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public long saveTasks(String title) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(FeedEntry.COLUMN_NAME_TITLE, title);
long newRowId = db.insert(FeedEntry.TABLE_NAME, null, contentValues);
return newRowId;
}
}
}
我正在尝试从另一个 java 文件的 onClick(View v) 方法访问 saveTasks(String title) 方法。
我这样试过:
MyDBHandler.FeedReaderDbHelper dbHelper = new MyDBHandler.FeedReaderDbHelper(v.getContext());
但我当然会收到“MyDBHandler 不是封闭的 class”错误。
或
MyDBHandler.FeedReaderDbHelper dbHelper= new MyDBHandler().new FeedReaderDbHelper(v.getContext());
但是,Android 工作室一直告诉我:“MyDbHandler 有私人访问权限”
甚至可以那样做吗?
如果你真的想保留你的内在 class 然后将其设为静态并按如下方式使用它:
new MyDBHandler.FeedReaderDbHelper(getContext())
MyDbHandler has a private access
这不是关于内部class,而是关于class
中的构造函数private MyDBHandler() {
}
我想我以前看过这个指南(网站),但我真的不知道他们为什么将其添加为内部 class。我记得他们说过要将构造函数设为私有,这样就没有人可以从中创建对象。
所以只需将 FeedReaderDbHelper
移动到一个单独的文件,然后它就可以工作了。
但如果出于某种原因你想将其保留在内部 class 然后将其定义为静态
public static class FeedReaderDbHelper
然后调用相同的代码,它应该可以工作
内部class只是一种将真正属于原始外部class的某些功能完全分离的方法。它们旨在在您有 2 个要求时使用:
- 你的外部 class 中的一些功能是最清楚的 如果它是在单独的 class. 中实现的
- 即使它在一个单独的 class 中,功能也非常紧密地联系在一起 使外部 class 工作的方式。
鉴于这些要求,内部 classes 可以完全访问其外部 class。由于它们基本上是外部 class 的成员,因此它们可以访问外部 class 的方法和属性是有道理的——包括私有
方法如下:
new MyDBHandler.FeedReaderDbHelper(getContext())
I have run your code by following way, Please have a look.
public class MyDBHandler {
public static FeedReaderDbHelper feedReaderDbHelper;
private MyDBHandler() {
}
public static FeedReaderDbHelper getFeedReaderDbHelper()
{
if(feedReaderDbHelper == null)
feedReaderDbHelper = new MyDBHandler(). new FeedReaderDbHelper();
return feedReaderDbHelper;
}
public static class FeedEntry {
public static final String TABLE_NAME = "Tasks";
public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
}
public class FeedReaderDbHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "myDatabase.db";
public FeedReaderDbHelper() {
//super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public long saveTasks(String title) {
System.out.println(title);
return 1L;
}
}
public static void main(String[] args) {
MyDBHandler.getFeedReaderDbHelper().saveTasks("title");
}
}
您可以将内部 class 静态化以使用它
public class MyDBHandler {
private MyDBHandler() {
}
public static class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "Tasks";
public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
}
public static class FeedReaderDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "myDatabase.db";
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public long saveTasks(String title) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(FeedEntry.COLUMN_NAME_TITLE, title);
long newRowId = db.insert(FeedEntry.TABLE_NAME, null, contentValues);
return newRowId;
}
}
}
现在要获取 FeedReaderDbHelper 实例,您可以
MyDBHandler.FeedReaderDbHelper dbHelper = new MyDBHandler.FeedReaderDbHelper(v.getContext());
并调用方法
String title = "your title";
dbHelper.saveTasks(title)