1
如何使用協議緩衝區編譯器爲我的服務生成java接口而不是抽象類?如何使用協議緩衝區編譯器爲我的服務生成java接口而不是抽象類?
現在我使用一個Gradle插件,它採用.proto文件,併爲我的服務而不是接口生成抽象類。考慮到Java不允許你擴展多個類,這可能會有問題。
我無法找到一個解決方案或方法到目前爲止,通過文件後,所以任何幫助將是偉大的。
我的build.gradle看起來像這樣
apply plugin: 'java'
apply plugin: 'com.google.protobuf'
buildscript {
repositories {
mavenCentral()
}
dependencies {
// ASSUMES GRADLE 2.12 OR HIGHER. Use plugin version 0.7.5 with earlier
// gradle versions
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
}
}
repositories {
mavenCentral()
mavenLocal()
}
// IMPORTANT: You probably want the non-SNAPSHOT version of gRPC. Make sure you
// are looking at a tagged version of the example and not "master"!
// Feel free to delete the comment at the next line. It is just for safely
// updating the version in our release process.
def grpcVersion = '1.0.0' // CURRENT_GRPC_VERSION
dependencies {
compile "io.grpc:grpc-netty:${grpcVersion}"
compile "io.grpc:grpc-protobuf:${grpcVersion}"
compile "io.grpc:grpc-stub:${grpcVersion}"
}
protobuf {
protoc {
// The version of protoc must match protobuf-java. If you don't depend on
// protobuf-java directly, you will be transitively depending on the
// protobuf-java version that grpc depends on.
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
grpc {
artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}"
}
}
generateProtoTasks {
all()*.plugins {
grpc {
// To generate deprecated interfaces and static bindService method,
// turn the enable_deprecated option to true below:
option 'enable_deprecated=false'
}
}
}
}
// Inform IntelliJ projects about the generated code.
apply plugin: 'idea'
idea {
module {
// Not using generatedSourceDirs because of
// https://discuss.gradle.org/t/support-for-intellij-2016/15294/8
sourceDirs += file("${projectDir}/build/generated/source/proto/main/java");
sourceDirs += file("${projectDir}/build/generated/source/proto/main/grpc");
}
我發現了原因,爲什麼它不產生界面看起來它已經被廢棄了,所以我不知道什麼是生成接口的方式。如果你看看我的build.gradleoption 'enable_deprecated=false'
將其設置爲true將生成接口,但註釋表示它已被棄用,所以我不確定什麼是生成接口的新方法。我想要接口而不是抽象類。
沒有接口代碼變得更加醜陋和麻煩。因爲Java不允許擴展多個類,並且在Java中實現多重繼承的唯一方法是通過實現多個接口。爲什麼不提供這兩個選項(抽象類和接口)?你可以說在Java 7之前必須使用抽象類,如果他們有Java 8,也可以使用接口。這將更加公平。在其他的說明中,許多設計模式表示接口的代碼不是類。接口是如此重要,只是沒有任何意義不支持它 – user1870400
確實,設計通常包含接口,但它們必須是不可變的。我建議你閱讀有效Java第18條的結尾部分,它被概括爲:「這條規則的一個例外情況是,緩解演化被認爲比靈活性和能力更重要。」 gRPC服務_必須允許進化。 –
當然,我不反對,但爲什麼不支持取決於Java版本的抽象類和接口? – user1870400