在Kotlin中如果你不想在构造函数或类体的顶部初始化类属性,你基本上有这两个选项(来自语言参考):
lazy()是一个函数,它接受一个lambda并返回一个Lazy实例,它可以作为实现一个惰性属性的委托:第一次调用get()执行传递给lazy()的lambda并记住结果,后续调用get()只返回记住的结果.
例
Run Code Online (Sandbox Code Playgroud)public class Hello { val myLazyString: String by lazy { "Hello" } }
所以第一次调用和子命令调用,无论它在哪里,到myLazyString将返回"Hello"
通常,必须在构造函数中初始化声明为具有非null类型的属性.但是,这通常不方便.例如,可以通过依赖注入或单元测试的设置方法初始化属性.在这种情况下,您无法在构造函数中提供非null初始值设定项,但在引用类体内的属性时仍希望避免空值检查.
要处理这种情况,可以使用lateinit修饰符标记属性:
Run Code Online (Sandbox Code Playgroud)public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }修饰符只能用于在类体(不在主构造函数中)内声明的var属性,并且只能在属性没有自定义getter或setter时使用.属性的类型必须为非null,并且它不能是基本类型.
那么,如何在这两个选项之间正确选择,因为它们都可以解决同样的问题?
我编写了两个测试用例LoginTest并SignUpTest使用了JUnit和一个Test Suite SessionUnitTestSuite.每次我想构建和运行我的应用程序时,我都必须运行测试套件(通过选择Test Suite然后单击"Run"),如果测试通过,则运行我的应用程序(通过选择应用程序模块和然后单击"运行").
有没有办法在运行我的应用程序模块之前自动运行测试,如果测试失败,取消我的应用程序的安装?
启用Google App Signing后,每当我尝试将已签名的版本APK上传到Play商店时,我都会收到错误消息,说明无法解析上传的APK的AndroidManifest.xml.编译得当吗?.
以下是使用APK分析工具从已签名的APK获取的Android清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="227"
android:versionName="4.9"
package="com.myproject">
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="25" />
<uses-permission
android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.VIBRATE" />
<uses-permission
android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission
android:name="android.permission.MANAGE_USERS" />
<uses-permission
android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission
android:name="com.android.vending.BILLING" />
<permission
android:name="com.myproject.permission.C2D_MESSAGE"
android:protectionLevel="0x2" />
<uses-permission
android:name="com.myproject.permission.C2D_MESSAGE" />
<application
android:theme="@ref/0x7f10013f"
android:label="@ref/0x7f0f004f"
android:icon="@ref/0x7f08005a"
android:name="br.com.regmoraes.myproject.CustomApp"
android:allowBackup="true"
android:largeHeap="true"
android:supportsRtl="true">
<meta-data
android:name="search-engine"
android:resource="@ref/0x7f120001" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@ref/0x7f0a0006" />
<meta-data
android:name="com.mixpanel.android.MPConfig.ResourcePackageName"
android:value="br.com.regmoraes.myproject" />
<meta-data
android:name="AA_MODELS" …Run Code Online (Sandbox Code Playgroud) android android-manifest apk google-play android-app-signing
我有一个名为的界面 UserManager
interface UserManager {
var user:User
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
和一个名为UserManagerImpl,实现的类UserManager
class UserManagerImpl : UserManager {
override var user: User // = must provide an User object
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
如何允许其他类设置一个User在UserManager()任何时间(即不提供初始User旁边的财产申报对象,并让另一个阶级创造和提供一个User实例)?
算一下吧
User是一个非null值,所以没有可空的属性(User?)setUser(User)和getUser()方法我有一个Android应用程序,它使用SQLite数据库和Active Android作为ORM.在每次应用更新时,我需要使用新的/更新的数据发送我的数据库.这就是我一直在做的事情
因此,当用户获取应用程序时,它将使用带有新内容的my_app_v2.db.
我知道Active Android 支持迁移脚本,但在每次数据库更新时,我需要添加/更新大约2000多条记录.因此,对于每个数据库更新,我需要一个包含2000多个插入/更新语句的迁移脚本,这意味着对于3个以上的连续升级,应用程序必须执行大约6000多个语句.
我想知道我用新的数据库替换整个数据库的方法是不好的做法,应该首选迁移脚本.
我正在开发一个 Android 应用程序,其架构基于Uncle 的 Bob Clean Architecture。
到目前为止,我已经实现了很多我的用例/交互器而没有问题。
我有以下用例:
搜索室
主要成功场景
延期
找不到房间
a) 系统根据给定的参数创建一个新房间
b) 系统加入房间的用户
我的问题是:我应该创建一个交互器(SearchOrCreateRoomAndJoin),还是应该创建三个交互器(SearchRoom、 CreateRoom 和JoinRoom)并根据我的用例描述将它们组合起来?
例子:
Room room = searchRoom.execute(roomOptions)
if(room != null){
joinRoom.execute(room)
}else{
Room room = createRoom.execute(roomOptions)
joinRoom.execute(room)
}
Run Code Online (Sandbox Code Playgroud)
重要的是,在我的应用程序的某些方面,我执行了一些交互器,例如SearchRoom
android ×4
kotlin ×2
apk ×1
architecture ×1
build.gradle ×1
database ×1
field ×1
google-play ×1
junit ×1
properties ×1
sqlite ×1
unit-testing ×1