3 回答

TA貢獻1851條經驗 獲得超3個贊
我見過的一種技術是將其與單元測試聯系起來(您進行單元測試,對嗎?)。基本上,您創建一個單元測試,一旦實現外部資源修復,該單元測試就會失敗。然后,您對該單元測試發表評論,以告訴其他人,一旦問題解決,如何撤消您的陳舊駭客。
這種方法真正令人眼前一亮的是,撤消黑客的誘因是對核心問題本身的修復。

TA貢獻1898條經驗 獲得超8個贊
我認為將由編譯器處理的自定義批注是解決方案。我經常編寫自定義批注以在運行時執行操作,但是我從未嘗試在編譯時使用它們。因此,我只能為您提供可能需要的工具的指導:
編寫自定義注釋類型。本頁說明如何編寫注釋。
編寫注釋處理器,處理您的自定義注釋以發出警告。運行此類注釋處理器的工具稱為APT。您可以在此頁面上找到介紹。我認為您需要在APT API中使用AnnotationProcessorEnvironment,它可以讓您發出警告。
從Java 6開始,APT已集成到javac中。也就是說,您可以在javac命令行中添加注釋處理器。javac手冊的這一部分將告訴您如何調用自定義注釋處理器。
我不知道這種解決方案是否切實可行。我會在有空的時候嘗試自己實現它。
編輯
我成功實現了我的解決方案。另外,我使用了Java的服務提供商功能來簡化其使用。實際上,我的解決方案是一個jar,其中包含2個類:自定義注釋和注釋處理器。要使用它,只需將此jar添加到項目的類路徑中,然后注釋任何內容即可!就在我的IDE(NetBeans)內部,這工作正常。
注釋代碼:
package fr.barjak.hack;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})
public @interface Hack {
}
處理器代碼:
package fr.barjak.hack_processor;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
@SupportedAnnotationTypes("fr.barjak.hack.Hack")
public class Processor extends AbstractProcessor {
private ProcessingEnvironment env;
@Override
public synchronized void init(ProcessingEnvironment pe) {
this.env = pe;
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (!roundEnv.processingOver()) {
for (TypeElement te : annotations) {
final Set< ? extends Element> elts = roundEnv.getElementsAnnotatedWith(te);
for (Element elt : elts) {
env.getMessager().printMessage(Kind.WARNING,
String.format("%s : thou shalt not hack %s", roundEnv.getRootElements(), elt),
elt);
}
}
}
return true;
}
}
要將生成的jar作為服務提供者啟用,請在jar中添加文件META-INF/services/javax.annotation.processing.Processor。此文件是acsii文件,必須包含以下文本:
fr.barjak.hack_processor.Processor

TA貢獻1757條經驗 獲得超7個贊
一些快速且不太臟的方法可能是使用@SuppressWarnings帶有故意錯誤String參數的注釋:
@SuppressWarnings("FIXME: this is a hack and should be fixed.")
這將生成警告,因為編譯器未將其識別為特定的警告,以禁止執行以下操作:
不支持的@SuppressWarnings(“ FIXME:這是一個hack,應該修復?!保?/p>
添加回答
舉報