2016-08-29 25 views
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將生成接口,但註釋表示它已被棄用,所以我不確定什麼是生成接口的新方法。我想要接口而不是抽象類。

回答

0

從API的角度來看,Java接口一旦創建就必須是不可變的,以防止破壞接口的使用者和實現者。由於向現有服務添加新方法需要API兼容,因此grpc-java被迫刪除接口。

在Java 8中使用默認方法可能是一個選項,但grpc-java不能很快需要Java 8,所以它可能會是一種新的代碼風格。

+0

沒有接口代碼變得更加醜陋和麻煩。因爲Java不允許擴展多個類,並且在Java中實現多重繼承的唯一方法是通過實現多個接口。爲什麼不提供這兩個選項(抽象類和接口)?你可以說在Java 7之前必須使用抽象類,如果他們有Java 8,也可以使用接口。這將更加公平。在其他的說明中,許多設計模式表示接口的代碼不是類。接口是如此重要,只是沒有任何意義不支持它 – user1870400

+0

確實,設計通常包含接口,但它們必須是不可變的。我建議你閱讀有效Java第18條的結尾部分,它被概括爲:「這條規則的一個例外情況是,緩解演化被認爲比靈活性和能力更重要。」 gRPC服務_必須允許進化。 –

+0

當然,我不反對,但爲什麼不支持取決於Java版本的抽象類和接口? – user1870400

相關問題