簡體   English   中英

從另一個類使用私有類構造函數訪問內部子類

[英]Accessing an inner subclass with private class constructor from another class

我正在創建SQL數據庫,並且基於此站點。 問題是,我不知道如何訪問內部類的方法,而外部類具有私有構造函數。

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不是封閉類”錯誤。

要么

MyDBHandler.FeedReaderDbHelper dbHelper= new MyDBHandler().new FeedReaderDbHelper(v.getContext());

但是Android Studio再次告訴我:“ MyDbHandler具有私有訪問權限”

有可能這樣做嗎?

如果您真的想保留您的內部類,則使其成為靜態並按如下方式使用它:

new MyDBHandler.FeedReaderDbHelper(getContext())

MyDbHandler has a private access

這與內部類無關,而與該類中的構造函數有關

private MyDBHandler() {
}

我想我以前看過本指南(網站),但我真的不知道為什么他們將其添加為內部類。 我記得他們說過將構造函數設為私有,所以沒有人可以用它創建對象。 因此,只需將FeedReaderDbHelper移到一個單獨的文件,然后它將起作用。

但是如果由於某種原因想要保留它的內部類,則將其定義為靜態

public static class FeedReaderDbHelper

然后調用相同的代碼,它應該可以工作

您可以使內部類靜態使用它

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)

內部類只是一種將真正屬於原始外部類的功能完全分開的方法。 當您有兩個要求時,可以使用它們:

  1. 如果是在單獨的類中實現的,那么外部類中的某些功能將最為清晰。
  2. 即使在單獨的類中,該功能也與外部類的工作方式密切相關。

鑒於這些要求,內部類可以完全訪問其外部類。 由於他們基本上是外部類的成員,因此可以訪問外部類的方法和屬性(包括私有)是有意義的

以下是方法:

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");
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM